Whiteha, include guard это те самые
C | ||
|
Защищают от множественного включения одного файла. Если, например, сделать
C | ||
|
И в этих хэдэрах подключается один и тот же заголовочныый файл, в котором не стоят инклуд гуарды, то собрать проект не выйдет.
Так что лучше их использовать всегда.
Директива #include просто подставляет содержимое файла. Так что сами представьте, что будет, если подставить содержимое одного файла дважды. Уж точно ничего хорошего
Сообщение от Whiteha
Насколько я помню расширение подключаемых файлов может быть хоть txt, тк препроцессор работает с текстовыми файлами, а какое им задать расширение это дело традиции
Совершенно верно. Однако, следует помнить, что иные способы могут вызвать кучу недоразумений и непониманий. Собственно отсюда и пошли традиции – чтобы все друг друга понимали.
Сообщение от Kuzia domovenok
Скажи, зачем мэйкфайлы человеку пытающемуся создать первый проект из двух файлов спп в MSVS? Инклуд стражи он уже использовал не там где надо.
То, что MSVS сама генерирует мэйкфайл или что-либо подобное не значит, что его нет или что этого человека можно обманывать, говоря о линкере как о всеумеющей тулзе. Это не так.
Не по теме:
Сообщение от Kuzia domovenok
Мне впадлу было.
Я так посмотрю с Вами часто такое.
Содержание
- Программа в с++ выдаёт: ошибку обнаружен многократно определенный символ — один или более
- Fatal error lnk1169 обнаружен многократно определенный символ один или более
- Лучший отвечающий
- Вопрос
- фатальная ошибка LNK1169: один или несколько кратно определенных символов, найденных в игровом программировании
- Решение
- Другие решения
- Fatal error lnk1169 обнаружен многократно определенный символ один или более
- Лучший отвечающий
- Вопрос
- фатальная ошибка LNK1169: в игровом программировании обнаружен один или несколько многократно определенных символов
- 6 ответы
Программа в с++ выдаёт: ошибку обнаружен многократно определенный символ — один или более
Причина, указанная Андреем Котоусовым, возможна, но маловероятна. Те, кто линкует в свой экзешник множество библиотек, не задают таких вопросов. Тем более что в современных библиотеках используются namespace’ы, так что столкновения имен обычно не происходит.
А ВЕРОЯТНАЯ причина вот какая. Вы поместили определение функции (подчеркиваю, именно определение, то есть ТЕЛО функции, а не ее декларацию) в *.h файл. Если этому файлу сделан #include только в ОДИН *.cpp файл, то линковка пройдет и линковщик ни на что не пожалуется. Но если этому файлу сделан #include в два или более *.cpp файлов, то после компиляции в каждом из них возникнет та же самая функция. Линковщик выругается, что видит больше одной функции с одним и тем же прототипом. Решения у этой проблемы два: или перенести тело функции в *.cpp файл, оставив в *.h файле только декларацию (прототип) , или оставить функцию на месте, но объявить ее inline.
Тот же самый эффект может получиться не только с функциями, но и с другими объектами. Скажем, для статических членов класса нужно давать определение в *.срр файле, за пределами определения класса. Но если вы поместите это определение в *.h файл, а затем сделаете этому файлу #include в два или более *.cpp файлов, то линковщик выругается, что он видит несколько определений одного и того же символа.
Кстати, Михаил Левин неправ: чтобы получить такую жалобу от линковщика, совершенно не обязательно сдублировать определение ИМЕННО фунции main. Любая функция проканает.
Источник
Fatal error lnk1169 обнаружен многократно определенный символ один или более
Лучший отвечающий
Вопрос
Язык программирования: C
Среда разработки: Visual Studio 2012 Express
Не могу понять следующее: я хочу связать между собой main.c и count.c(как они выглядят можно найти ниже).
В count.c определена переменная num, которая равна 10. В main.c я хочу вывести переменную num на экран.
Если определить num как static int num = 10, то всё работает, однако как только я уберу static выходят следующие ошибки:
Ошибка 1 error LNK2005: _b уже определен в count.obj c:UsersМОЁ ИМЯdocumentsvisual studio 2012Projectstest_29test_29main.obj test_29
Ошибка 2 error LNK1169: обнаружен многократно определенный символ — один или более c:usersМОЁ ИМЯdocumentsvisual studio 2012Projectstest_29Debugtest_29.exe test_29
Пожалуйста, объясните в чём ошибка. И да, разве static не должен скрывать переменную от других файлов?
Источник
фатальная ошибка LNK1169: один или несколько кратно определенных символов, найденных в игровом программировании
Я тренировался использовать объектно-ориентированное программирование в C ++, но я продолжаю получать эту ошибку:
Однако, мне кажется, что весь код написан правильно, и эти два целых числа упоминаются только в глобальном заголовке, и все объекты, похоже, наследуются правильно. Однако, как я только что сказал, я новичок в ООП, поэтому мне действительно нужно мнение: Стоит также упомянуть, что я использую allegro 5 для создания бокового шутера.
Решение
Два int переменные определенный в заголовочном файле. Это означает, что каждый исходный файл, который включает заголовок, будет содержать их определение (включение заголовка является чисто текстовым). Конечно, приводит к множественным ошибкам определения.
У вас есть несколько вариантов, чтобы это исправить.
Сделать переменные static ( static int WIDTH = 1024; ). Они будут по-прежнему существовать в каждом исходном файле, но их определения не будут видны за пределами исходного файла.
Превратите их определения в декларации, используя extern ( extern int WIDTH; ) и положить определение в один исходный файл: int WIDTH = 1024; ,
Вероятно, лучший вариант: сделать переменные const ( const int WIDTH = 1024; ). Это делает их static неявно, а также позволяет использовать их в качестве констант времени компиляции, что позволяет компилятору использовать их значение напрямую, а не выдавать код для чтения его из переменной и т. д.
Другие решения
Вы не можете помещать определения переменных в файлы заголовков, так как они будут частью всего исходного файла, в который вы включаете заголовок.
#pragma once просто для защиты от нескольких включений в одном исходном файле, а не от нескольких включений в нескольких исходных файлах.
Вы могли бы объявлять переменные как extern в заголовочном файле, а затем определять их в одном исходном файле. Или же вы можете объявить переменные как const в заголовочном файле, и компилятор и компоновщик будут управлять им.
Источник
Fatal error lnk1169 обнаружен многократно определенный символ один или более
Лучший отвечающий
Вопрос
Язык программирования: C
Среда разработки: Visual Studio 2012 Express
Не могу понять следующее: я хочу связать между собой main.c и count.c(как они выглядят можно найти ниже).
В count.c определена переменная num, которая равна 10. В main.c я хочу вывести переменную num на экран.
Если определить num как static int num = 10, то всё работает, однако как только я уберу static выходят следующие ошибки:
Ошибка 1 error LNK2005: _b уже определен в count.obj c:UsersМОЁ ИМЯdocumentsvisual studio 2012Projectstest_29test_29main.obj test_29
Ошибка 2 error LNK1169: обнаружен многократно определенный символ — один или более c:usersМОЁ ИМЯdocumentsvisual studio 2012Projectstest_29Debugtest_29.exe test_29
Пожалуйста, объясните в чём ошибка. И да, разве static не должен скрывать переменную от других файлов?
Источник
фатальная ошибка LNK1169: в игровом программировании обнаружен один или несколько многократно определенных символов
Я тренировался использовать объектно-ориентированное программирование на С++, но я продолжаю получать эту ошибку:
Однако мне кажется, что весь код написан правильно, и два целых числа упоминаются только в глобальном заголовке, и все объекты, похоже, наследуются правильно. Однако, как я только что сказал, я новичок в ООП, поэтому мне действительно нужно мнение: также стоит упомянуть, что я использую allegro 5 для создания бокового шутера.
задан 20 марта ’13, 07:03
6 ответы
Эти два int переменные определенный в заголовочном файле. Это означает, что каждый исходный файл, который включает заголовок, будет содержать их определение (включение заголовка является чисто текстовым). Это, конечно, приводит к множественным ошибкам определения.
У вас есть несколько вариантов исправить это.
Сделайте переменные static ( static int WIDTH = 1024; ). Они по-прежнему будут существовать в каждом исходном файле, но их определения не будут видны за пределами исходного файла.
Превратите их определения в объявления, используя extern ( extern int WIDTH; ) и поместите определение в one исходный файл: int WIDTH = 1024; .
Вероятно, лучший вариант: сделать переменные const ( const int WIDTH = 1024; ). Это делает их static неявно, а также позволяет использовать их в качестве констант времени компиляции, позволяя компилятору использовать их значение напрямую, вместо того, чтобы выдавать код для чтения его из переменной и т. д.
Источник
Я тренировался использовать объектно-ориентированное программирование в C ++, но я продолжаю получать эту ошибку:
1>main.obj : error LNK2005: "int WIDTH" (?WIDTH@@3HA) already defined in GameObject.obj
1>main.obj : error LNK2005: "int HEIGHT" (?HEIGHT@@3HA) already defined in GameObject.obj
1>Spaceship.obj : error LNK2005: "int WIDTH" (?WIDTH@@3HA) already defined in GameObject.obj
1>Spaceship.obj : error LNK2005: "int HEIGHT" (?HEIGHT@@3HA) already defined in GameObject.obj
1>C:Usersteddocumentsvisual studio 2010ProjectsfullSpaceDebugfullSpace.exe : fatal error LNK1169: one or more multiply defined symbols found
Однако, мне кажется, что весь код написан правильно, и эти два целых числа упоминаются только в глобальном заголовке, и все объекты, похоже, наследуются правильно. Однако, как я только что сказал, я новичок в ООП, поэтому мне действительно нужно мнение: Стоит также упомянуть, что я использую allegro 5 для создания бокового шутера.
Это код:
(главный):
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_font.h>
#include <allegro5allegro_ttf.h>
#include <allegro5allegro_audio.h>
#include <allegro5allegro_acodec.h>
#include <list>#include "GameObject.h"#include "Spaceship.h"#include "Globals.h"//controls
bool keys[] = {false, false, false, false, false};
enum KEYS{UP, DOWN, LEFT, RIGHT, SPACE};
//globals
Spaceship *ship;
std::list <GameObject *> objects;
std::list <GameObject *>::iterator iter;
std::list <GameObject *>::iterator iter2;//prototypes//main function
int main(int argc, char **argv)
{
//shell variables
bool done = false;
bool render = false;
float gameTime = 0;
int frames = 0;
int gameFPS = 0;
//project variables
ship = new Spaceship();ALLEGRO_BITMAP *shipImage = NULL;
ALLEGRO_BITMAP *cometImage= NULL;
ALLEGRO_BITMAP *explImage = NULL;
ALLEGRO_BITMAP *bgImage = NULL;
ALLEGRO_BITMAP *mgImage = NULL;
ALLEGRO_BITMAP *plImage = NULL;
ALLEGRO_BITMAP *mgImage2 = NULL;
ALLEGRO_BITMAP *fgImage = NULL;
ALLEGRO_BITMAP *titleImage= NULL;
ALLEGRO_BITMAP *lostImage = NULL;//allegro variables
ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_EVENT_QUEUE *event_queue = NULL;
ALLEGRO_TIMER *timer;
ALLEGRO_FONT *font18;//initiate variables
if(!al_init())
return -1;
display = al_create_display(WIDTH, HEIGHT);
if(!display)
return -1;
//addon installation
al_install_keyboard();
al_init_image_addon();
al_init_font_addon();
al_init_ttf_addon();
al_init_primitives_addon();
al_install_audio();
al_init_acodec_addon();
//project init
font18 = al_load_font("arial.ttf", 18, 0);
al_reserve_samples(15);bgImage = al_load_bitmap("layer1.png");
mgImage = al_load_bitmap("layer2.png");
plImage = al_load_bitmap("starMG.png");
mgImage2 = al_load_bitmap("layer3.png");
fgImage = al_load_bitmap("layer4.png");shipImage = al_load_bitmap("spaceship.png");
al_convert_mask_to_alpha(shipImage, al_map_rgb(255, 0, 255));cometImage = al_load_bitmap("asteroid-1-96.png");
explImage = al_load_bitmap("explosion_3_40_128.png");
titleImage = al_load_bitmap("Shooter_Title.png");
lostImage = al_load_bitmap("Shooter_Lose.png");//object init
ship->init(shipImage);//iter list
objects.push_back(ship);srand(time(NULL));
//timer init and startup
event_queue = al_create_event_queue();
timer = al_create_timer(1.0 / 60);
al_register_event_source(event_queue, al_get_timer_event_source(timer));
al_register_event_source(event_queue, al_get_keyboard_event_source());
al_start_timer(timer);
gameTime = al_current_time();
while(!done)
{
ALLEGRO_EVENT ev;
al_wait_for_event(event_queue, &ev);
//input
if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
{
switch(ev.keyboard.keycode)
{
case ALLEGRO_KEY_ESCAPE:
done = true;
break;
case ALLEGRO_KEY_LEFT:
keys[LEFT] = true;
break;
case ALLEGRO_KEY_RIGHT:
keys[RIGHT] = true;
break;
case ALLEGRO_KEY_UP:
keys[UP] = true;
break;
case ALLEGRO_KEY_DOWN:
keys[DOWN] = true;
break;
case ALLEGRO_KEY_SPACE:
keys[SPACE] = true;
break;}
} else if(ev.type == ALLEGRO_EVENT_KEY_UP)
{
switch(ev.keyboard.keycode)
{
case ALLEGRO_KEY_ESCAPE:
done = true;
break;
case ALLEGRO_KEY_LEFT:
keys[LEFT] = false;
break;
case ALLEGRO_KEY_RIGHT:
keys[RIGHT] = false;
break;
case ALLEGRO_KEY_UP:
keys[UP] = false;
break;
case ALLEGRO_KEY_DOWN:
keys[DOWN] = false;
break;
case ALLEGRO_KEY_SPACE:
keys[SPACE] = false;
break;
}
}else if (ev.type == ALLEGRO_EVENT_TIMER)
{
render = true;
//fps
frames++;
if(al_current_time() - gameTime >= 1)
{
gameTime = al_current_time();
gameFPS = frames;
frames = 0;
}
//shipUpdate
if(keys[UP])
ship ->moveUp();
else if(keys[DOWN])
ship ->moveDown();
else
ship->resetAnim(1);
if(keys[LEFT])
ship ->moveLeft();
else if(keys[RIGHT])
ship -> moveRight();
else
ship ->resetAnim(0);
}
//render
if(render && al_is_event_queue_empty(event_queue))
{
render = false;
//begin render
for(iter = objects.begin(); iter != objects.end(); ++iter)
(*iter)->render();//Flip Buffers
al_flip_display();
al_clear_to_color(al_map_rgb(0,0,0));
}
}
//destroy objects//visual objects
al_destroy_bitmap(cometImage);
for(iter = objects.begin(); iter != objects.end(); ++iter)
(*iter)->destroy(shipImage);
iter = objects.erase(iter);
al_destroy_bitmap(explImage);
al_destroy_bitmap(bgImage);
al_destroy_bitmap(mgImage);
al_destroy_bitmap(fgImage);
al_destroy_bitmap(titleImage);
al_destroy_bitmap(lostImage);
//audio objects
/*
al_destroy_sample(shot);
al_destroy_sample(boom);
al_destroy_sample(song);
al_destroy_sample_instance(songInstance);
*///shell objects
al_destroy_font(font18);
al_destroy_timer(timer);
al_destroy_event_queue(event_queue);
al_destroy_display(display);
return 0;
}
(Globals.h):
#pragma once
int WIDTH = 1024;
int HEIGHT = 800;
enum ID{PLAYER, ENEMY, BULLET, BORDER, MISC};
enum STATES{TITLE, PLAYING, LOST};
(GameObject.h):
#pragma once#include "Globals.h"#include <iostream>
#include <allegro5/allegro5.h>
#include <allegro5/allegro_primitives.h>class GameObject
{
private:
int ID;
bool alive;
bool collidable;
protected:
float x;
float y;
float velX;
float velY;
int dirX;
int dirY;
int boundX;
int boundY;
int maxFrame;
int curFrame;
int frameCount;
int frameDelay;
int frameWidth;
int frameHeight;
int animationColumns;
int animationDirection;
ALLEGRO_BITMAP *image;
public:
GameObject();
void virtual destroy(ALLEGRO_BITMAP *image);
void init(float x, float y, float velX, float velY, int dirX, int dirY, int boundX, int boundY);
void virtual update();
void virtual render();
float getX() {return x;}
float getY() {return y;}
void setX(float x) {GameObject::x = x;}
void setY(float y) {GameObject::y = y;}
int getBoundX() {return boundX;}
int getBoundY() {return boundY;}
int getID() {return ID;}
void setID(int ID) {GameObject::ID = ID;}
bool getAlive() {return alive;}
void setAlive(bool alive) {GameObject::alive = alive;}
bool getCollidable() {return collidable;}
void setCollidable(bool collidable) {GameObject::collidable = collidable;}
bool checkCollisions(GameObject *otherObject);
void virtual collided(int objectID);
bool collidableCheck();
};
(GameObject.cpp):
#include "GameObject.h"
GameObject::GameObject()
{
x = 0;
y = 0;
velX = 0;
velY = 0;
dirX = 0;
dirY = 0;
boundX = 0;
boundY = 0;
maxFrame = 0;
curFrame = 0;
frameCount = 0;
frameDelay = 0;
frameWidth = 0;
frameHeight = 0;
animationColumns = 0;
animationDirection = 0;
image = NULL;
alive = true;
collidable = true;
}
void GameObject::destroy(ALLEGRO_BITMAP *image)
{
if(image != NULL)
al_destroy_bitmap(image);
}
void GameObject::init(float x, float y, float velX, float velY, int dirX, int dirY, int boundX, int boundY)
{
GameObject::x = x;
GameObject::y = y;
GameObject::velX = velX;
GameObject::velY = velY;
GameObject::dirX = dirX;
GameObject::dirY = dirY;
GameObject::boundX = boundX;
GameObject::boundY = boundY;
}
void GameObject::update()
{
x += velX*dirX;
y += velY*dirY;
}
void GameObject::render()
{
}
bool GameObject::checkCollisions(GameObject *otherObject)
{
float oX = otherObject->getX();
float oY = otherObject->getY();
int obX = otherObject->getBoundX();
int obY = otherObject->getBoundY();
if(x + boundX > oX - obX &&
x - boundX < oX + obX &&
y + boundY > oY - obY &&
y - boundY < oY + obY
)
return true;
else
return false;
}
void GameObject::collided(int objectID)
{
}
bool GameObject::collidableCheck()
{
return alive && collidable;
}
(SpaceShip.h):
#pragma once
#include "GameObject.h"
class Spaceship : public GameObject
{
private :
int lives;
int score;
int animationRow;
public :
Spaceship();
void destroy(ALLEGRO_BITMAP *image);
void init(ALLEGRO_BITMAP *image = NULL);
void update();
void render();
void moveUp();
void moveDown();
void moveLeft();
void moveRight();
void resetAnim(int pos);
int getLives(){return lives;}
int getScore() {return score;}
void looseLife() {lives--;}
void addPoint() {score++;}
void collide(int objectID);};
(SpaceShip.cpp):
#include "Spaceship.h"
Spaceship::Spaceship()
{}
void Spaceship::destroy(ALLEGRO_BITMAP *image)
{
GameObject::destroy(image);
}
void Spaceship::init(ALLEGRO_BITMAP *image)
{
GameObject::init(20, 200, 6, 6, 0, 0, 10, 12);
setID(PLAYER);
setAlive(true);
lives = 3;
score = 0;
maxFrame = 3;
curFrame = 0;
frameWidth = 46;
frameHeight = 41;
animationColumns = 3;
animationDirection = 1;
animationRow = 1;
if(image != NULL)
{
Spaceship::image = image;
}
}
void Spaceship::update()
{
GameObject::update();
if(x < 0)
x=0;
else if ( x > WIDTH)
x = WIDTH;
if(y < 0)
y = 0;
else if (y > HEIGHT)
y = HEIGHT;
}
void Spaceship::render()
{
GameObject::render();
int fx = (curFrame % animationColumns) *frameWidth;
int fy = animationRow *frameHeight;
al_draw_bitmap_region(image, fx, fy, frameWidth, frameHeight,
x - frameWidth /2, y - frameHeight /2, 0);
}
void Spaceship::moveUp()
{
animationRow = 0;
dirY = -1;
}
void Spaceship::moveDown()
{
animationRow = 2;
dirY = 1;
}
void Spaceship::moveLeft()
{
curFrame = 2;
dirX = -1;
}
void Spaceship::moveRight()
{
curFrame = 1;
dirX = 1;
}
void Spaceship::resetAnim(int pos)
{
if(pos == 1)
{
animationRow = 1;
dirY = 0;
}
else
{
curFrame = 0;
dirX = 0;
}
}
void Spaceship::collide(int objectID)
{
if(objectID == ENEMY)
lives--;
}
17
Решение
Два int
переменные определенный в заголовочном файле. Это означает, что каждый исходный файл, который включает заголовок, будет содержать их определение (включение заголовка является чисто текстовым). Конечно, приводит к множественным ошибкам определения.
У вас есть несколько вариантов, чтобы это исправить.
-
Сделать переменные
static
(static int WIDTH = 1024;
). Они будут по-прежнему существовать в каждом исходном файле, но их определения не будут видны за пределами исходного файла. -
Превратите их определения в декларации, используя
extern
(extern int WIDTH;
) и положить определение в один исходный файл:int WIDTH = 1024;
, -
Вероятно, лучший вариант: сделать переменные
const
(const int WIDTH = 1024;
). Это делает ихstatic
неявно, а также позволяет использовать их в качестве констант времени компиляции, что позволяет компилятору использовать их значение напрямую, а не выдавать код для чтения его из переменной и т. д.
48
Другие решения
Вы не можете помещать определения переменных в файлы заголовков, так как они будут частью всего исходного файла, в который вы включаете заголовок.
#pragma once
просто для защиты от нескольких включений в одном исходном файле, а не от нескольких включений в нескольких исходных файлах.
Вы могли бы объявлять переменные как extern
в заголовочном файле, а затем определять их в одном исходном файле. Или же вы можете объявить переменные как const
в заголовочном файле, и компилятор и компоновщик будут управлять им.
5
const int WIDTH = 1024;
const int HEIGHT = 800;
2
Сергей Решетников
Ученик
(244),
закрыт
10 лет назад
#include<iostream>
using namespace std;
int main()
{
setlocale (LC_ALL,”.ACP”);
double E,m,L,d0,d ;
const double Pi=3.14;
cout<<“Введите E”<<endl;>>E;
cout<<“Введите m”<<endl;>>m;
cout<<“Введите L”<<endl;>>L;
L=L*100;
cout<<“Введите d0″<<endl;>>d0;
d=1;
while (d<=7);
{
double k=(Pi*E*(pow(d0,4)-pow(d,4)))/(55.5*(1+m)*L);
cout<<d<<“>=7)&&(d<=9.5));
system(“pause”);
}
немогу понять где ошибка, пишет
1>c++LaboratorkiDebugLaboratorki.exe : fatal error LNK1169: обнаружен многократно определенный символ – один или более
Дополнен 10 лет назад
а что за сайт?)
Дополнен 10 лет назад
всё сделал, просто каждую программку нужно в новом проекте делать
спасибо)
Дополнен 10 лет назад
дак я main убираю, он мне начитает “cout” подчёркивать
Зло
Просветленный
(37717)
10 лет назад
cînst dîuble Pi=3.14;
cоnst dоuble Pi=3.14;
мне выдало, что в этой строчке у тебя все о – русские буквы 0_0
+ нет #include <math.h>
+ ттут совсем кровавое месиво получилось
cout<<d<<“>=7)&&(d<=9.5));
system(“pause”);
}
код – на pastebin.com
>а что за сайт? )
самый обычный сайт. ворует деньги, пароли, заражает вирусами, любит гусей.
однако, там ты сможешь свой код выложить без проблем + подсветка синтаксиса
Капитан Гугл
Искусственный Интеллект
(145967)
10 лет назад
Код выложи на pastebin.com, а сюда – ссылку. Ответы пожевали код, а не видя кода, нельзя ответить на вопрос.
Хотя вообще похоже, что проблема где-то еще, например, ты в проекте два файла с main создал или что-то таке.. .
—
Зло, русские о вместо английских в const – это фишка Ответов. Нафига – не знаю, вот такие они загадочные.. .
—
Сергей, это, как ни странно, сайт для выкладывания кода. Неочевидно, да?
—
Можно и несколько в одном проекте (для этого проекты и придумали, ага) , только main должен быть один.
Не доходит как правильно “рассовать” написанный мной код.
Возможно ошибка связана с fstream?
Файл main.cpp
#include "stdafx.h"
#include "Steck.h"
int main()
{
setlocale(LC_ALL, "Russian");
file.open("Text.txt");
if (!file.is_open())
{
cout << "Файл не найден!";
_getch();
return 1;
}
Stack1 *st1;
Stek2 *st2;
bool done = false;
int temp;
while (!done)
{
switch (menu())
{
case 1:
st1->file_input_push_ch(st1);
st2->file_input_push_nech(st2);
break;
case 2:
cout << endl << "Номер состава:";
cin >> temp;
if (temp % 2 == 0)
st1->push_ch(st1, temp);
else
st2->push_nech(st2,temp);
cout << endl;
break;
case 3:
st1->print_ch(st1);
st2->print_nech(st2);
break;
case 4:
cout << " Конец работы. " << endl;
done = true;
break;
default:
cout << endl << " Внимание!!! Вводите только цифры от 1-го до 4-ёх!" << endl;
break;
}
}
_getch();
return 0;
}
Файл Steck.h
#pragma once
#ifndef FILENAME_H
#define FILENAME_H
#include <fstream>
#include <iostream>
#include <conio.h>
using std::ifstream;
using std::cout;
using std::cin;
using std::endl;
ifstream file;
int menu();
class Stack1
{
public:
Stack1() :ch(0), next(0)
{
cout << endl << "Constructor1 working..." << endl;
}
~Stack1();
void push_ch(Stack1*&, int);
void file_input_push_ch(Stack1*&);
void print_ch(Stack1*);
private:
int ch;
Stack1 *next;
};
class Stek2
{
public:
Stek2() :nech(0), next(0)
{
cout << endl << "Constructor2 working..." << endl;
}
void push_nech(Stek2*&, int);
void file_input_push_nech(Stek2*&);
void print_nech(Stek2*);
~Stek2();
private:
int nech;
Stek2 *next;
};
#endif // !FILENAME_H
И файл Stack.cpp
#include "stdafx.h"
#include "Steck.h"
int menu()
{
char buf[10];
int option;
do
{
cout << endl << "1 - Ввести данные с файла." << endl;
cout << endl << "2 - Ввести данные вручную." << endl;
cout << endl << "3 - Вывести состояние сортировочного узла" << endl;
cout << endl << "4 - Выход из программы." << endl;
cin >> buf; option = atoi(buf);
} while (!option);
cin.get();
return option;
}
void Stack1::push_ch(Stack1 *&next, int temp)
{
Stack1 *pv = new Stack1;
if (temp % 2 == 0)
{
pv->ch = temp;
pv->next = next;
next = pv;
}
else
delete pv;
}
void Stack1::file_input_push_ch(Stack1 *&next)
{
int temp;
while (!file.eof())
{
file >> temp;
push_ch(next, temp);
}
}
void Stack1::print_ch(Stack1 *b)
{
Stack1 *print = b;
if (print == NULL)
cout << endl << " Чётных нет. " << endl;
else
{
cout << endl << "Чётные номера: " << endl;
while (print)
{
cout << print->ch << " ";
print = print->next;
}
cout << endl;
}
}
Stack1::~Stack1()
{
cout << endl << "Destructor1 working..." << endl;
while (next)
{
Stack1 *p;
p = next;
next = next->next;
delete p;
}
}
void Stek2::push_nech(Stek2 *&next, int temp)
{
Stek2 *pv = new Stek2;
if (temp % 2 != 0)
{
pv->nech = temp;
pv->next = next;
next = pv;
}
else
delete pv;
}
void Stek2::file_input_push_nech(Stek2 *&next)
{
int temp;
while (!file.eof())
{
file >> temp;
push_nech(next, temp);
}
}
void Stek2::print_nech(Stek2 *b)
{
Stek2 *print;
print = b;
if (print == NULL)
cout << endl << " Нечетных нет. " << endl;
else
{
cout << endl << "Нечётные номера: " << endl;
while (print)
{
cout << print->nech << " ";
print = print->next;
}
cout << endl;
}
}
Stek2::~Stek2()
{
cout << endl << "Destructor2 working..." << endl;
while (next)
{
Stek2 *p;
p = next;
next = next->next;
delete p;
}
}
Пытаюсь “построить” выдаёт следующее:
Ошибка LNK2005 “class std::basic_ifstream<char,struct
std::char_traits > file” (?file@@3V?$basic_ifstream@DU?
$char_traits@D@std@@@std@@A) уже определен в
Stack.obj Классы_вариант_1 C:UsersСемёнDocumentsVisual Studio
2015ProjectsКлассы_вариант_1Классы_вариант_1Классы_вариант_1.obj 1Ошибка LNK1169 обнаружен многократно определенный символ – один или
более Классы_вариант_1 C:UsersСемёнDocumentsVisual Studio
2015ProjectsКлассы_вариант_1DebugКлассы_вариант_1.exe 1
Может у кого-нибудь был опыт? Отпишитесь.