2014-10-19 2 views
0

Я получаю странную ошибку определения в проекте, я работаю под gcc. Я просмотрел все подобные ошибки, которые люди жаловались на форумах, но я не могу решить проблему на основе их обходных решений. Я делаю змеиный игры под Linux с Ncurses библиотеки Anways у меня есть point.h, который имеетОшибка нескольких определений с gcc

#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

+0

Какова ваша команда для компилятора и компоновщика? –

+1

Вы определяете функции в файлах заголовков. Не делайте этого, он вызывает эту ошибку. Определите их в файлах '.cpp'. –

+0

попытался использовать «g ++ -std = C++ 11 main.cpp snake.cpp -lncurses» и некоторые другие варианты. – photonist

ответ

0

Это неправильно, чтобы иметь в заголовке:

point::point(){ 
    x=0; 
    y=0; 
} 

Если одна и та же функция включена в два разных блока, то это тело функции определяется дважды, нарушая одно определение n Правило.

Функциональный орган может иметь не более одного не встроенного определения во всей программе. Разрешено несколько встроенных определений, если они точно идентичны. (В обоих случаях каждая единица перевода может по-прежнему иметь не более одного определения).

Чтобы это исправить, либо:

  • Определим функцию в линии в определении класса
  • Переместить функцию в .cpp файле

То же самое для другого конструктора.

+0

, к сожалению, я также попытался переместить эти функции в файл point.cpp. не решила мою проблему. И как я могу сделать эти функции встроенными? Конструктор структуры – photonist

+0

пример строки inline имеет точку() {x = 0; y = 0; } 'в определении класса. Если вы переместили эти функции в файл point.cpp и все еще получаете проблему, обновите сообщение, чтобы показать эту версию кода (и убедитесь, что вы компилируете именно то, что вы отправили). –

+0

Также попробуйте указать ** минимальный ** пример ; например 'float delay, acceleration;' не имеет ничего общего с вашей проблемой и может быть удалено.то же самое касается большей части того, что вы опубликовали. –

Смежные вопросы