Ошибка нескольких определений с gcc

0

Я получаю странную ошибку с множественным определением в проекте, который я работаю под 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

  • 0
    Какая у вас команда компилятора и компоновщика?
  • 1
    Вы определяете функции в заголовочных файлах. Не делайте этого, это вызывает эту ошибку. Определите их в .cpp файлах.
Показать ещё 2 комментария
Теги:
gcc

1 ответ

0

Это неверно для заголовка:

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

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

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

Чтобы исправить это, выполните следующие действия:

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

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

  • 0
    К сожалению, я также попытался переместить эти функции в файл point.cpp, но это не решило мою проблему. И как я могу сделать эти функции встроенными? Конструктор структуры
  • 0
    пример inline имеет point() { x = 0; y = 0; } в определении класса. Если вы переместили эти функции в point.cpp и все еще получаете проблему, обновите ваш пост, чтобы показать эту версию кода (и убедитесь, что вы компилируете именно то, что вы опубликовали)
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню