Я получаю странную ошибку с множественным определением в проекте, который я работаю под gcc. Я просмотрел все подобные ошибки, которые люди жаловались на форумах, но я не могу решить проблему на основе их обходных решений. Я делаю змеиную игру под linux с библиотекой ncurses, у меня есть point.h, которая имеет
#ifndef POINT_H
#define POINT_H
struct point
{
int x,y;
point();
point(int col,int row);
};
point::point(){
x=0;
y=0;
}
point::point(int col,int row)
{
y=col;
x=row;
}
#endif
draw.h, который имеет только методы визуализации змеи с ncurses и snake.h
#ifndef SNAKE_H
#define SNAKE_H
#include "point.h"
#include "draw.h"
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <deque>
class snake
{
private:
int maxwidth,maxheight;
float delay,acceleration;
int old_axis,direction,tailtime,tailcurrent;
int limit_down,limit_right;
std::deque<point> dsnake;
std::deque<point> food;
char blk,partchr;
public:
snake();
void drawBorders();
void drawSnake();
void clearSnake();
void start();
void moveSnake(int towards);
void moveSnake();
void play();
void TailAdd();
point getmovePoint(point pos,int axis);
void getDirection();
void generateFood();
void drawFood();
};
#endif
но я получаю ошибку, когда я скомпилирую, с которым я попробовал это с большим количеством различных флагов g++. Пробовал делать класс точки вместо структуры и определял declerations в файле cpp, но они, к сожалению, не работают. Проект работает, только если я включил "snake.cpp" в main.cpp, который, на мой взгляд, не является разумным решением.
g++ -std=c++11 main.cpp snake.cpp -lncurses
/tmp/ccCSPcUp.o: In function 'point::point()':
snake.cpp:(.text+0x0): multiple definition of 'point::point()'
/tmp/cc1BDIIH.o:main.cpp:(.text+0x0): first defined here
/tmp/ccCSPcUp.o: In function 'point::point()':
snake.cpp:(.text+0x0): multiple definition of 'point::point()'
/tmp/cc1BDIIH.o:main.cpp:(.text+0x0): first defined here
/tmp/ccCSPcUp.o: In function 'point::point(int, int)':
snake.cpp:(.text+0x20): multiple definition of 'point::point(int, int)'
/tmp/cc1BDIIH.o:main.cpp:(.text+0x20): first defined here
/tmp/ccCSPcUp.o: In function 'point::point(int, int)':
snake.cpp:(.text+0x20): multiple definition of 'point::point(int, int)'
/tmp/cc1BDIIH.o:main.cpp:(.text+0x20): first defined here
/tmp/ccCSPcUp.o: In function 'init()':
snake.cpp:(.text+0x43): multiple definition of 'init()'
/tmp/cc1BDIIH.o:main.cpp:(.text+0x43): first defined here
/tmp/ccCSPcUp.o: In function 'getMax(bool)':
snake.cpp:(.text+0x85): multiple definition of 'getMax(bool)'
/tmp/cc1BDIIH.o:main.cpp:(.text+0x85): first defined here
/tmp/ccCSPcUp.o: In function 'drawColumn(int, char)':
snake.cpp:(.text+0xe8): multiple definition of 'drawColumn(int, char)'
/tmp/cc1BDIIH.o:main.cpp:(.text+0xe8): first defined here
/tmp/ccCSPcUp.o: In function 'drawLine(int, char)':
snake.cpp:(.text+0x140): multiple definition of 'drawLine(int, char)'
/tmp/cc1BDIIH.o:main.cpp:(.text+0x140): first defined here
collect2: error: ld returned 1 exit status
и вот остальные мои файлы.
http://pastie.org/private/gpzbuohvlxhzyz5z4vjsw draw.h http://pastie.org/private/pfvriwssdzwreab5ibyww main.cpp http://pastie.org/private/ehkyvcodge7w1wqwpsbw point.h http://pastie.org/private/eomqodk9di3tj1ramyfg snake.cpp http://pastie.org/private/wznpkpayh9iopvjnrdfjw snake.h
Это неверно для заголовка:
point::point(){
x=0;
y=0;
}
Если одна и та же функция включена в две разные единицы, то это тело функции определено дважды, нарушая правило одного определения.
Тело функции может содержать не более одного нестрочного определения во всей программе. Разрешено несколько встроенных определений, если они точно идентичны. (В обоих случаях каждая единица перевода может по-прежнему иметь не более одного определения).
Чтобы исправить это, выполните следующие действия:
То же самое касается другого конструктора.
point() { x = 0; y = 0; }
в определении класса. Если вы переместили эти функции в point.cpp и все еще получаете проблему, обновите ваш пост, чтобы показать эту версию кода (и убедитесь, что вы компилируете именно то, что вы опубликовали)
.cpp
файлах.