ошибка множественного объявления - виртуальные функции - PullRequest
0 голосов
/ 06 января 2011

У меня есть файлы наблюдателя.h, клиента.h и field.h.

В Observer.h существует класс Subject, который имеет

// observer.h

class Subject  {
public:
 virtual ~Subject(){};
 Subject(){};
 virtual void Attach(Observer*);
 virtual void Detach(Observer*);
 virtual void Notify(bool _value);
 virtual bool getCheckedIn(){};
private:
 vector < Observer* >  _observers;
};

#ifndef CLIENT_H
#define CLIENT_H

#include "Field.h"

class Client : public Subject {
public:
 Client(string _name, Field *_field) : client_name(_name) ,field(_field) , checked_in(false) {}

 void setCheckedIn(bool _value){
  checked_in = _value;
  Notify(_value);
 }

 void enterRow(string _row_name){
  field->deneme();
  setCheckedIn(true);
 }

 bool getCheckedIn(){ return checked_in;}
private:
 bool checked_in;
 string client_name;

 Field *field;

};

#endif // CLIENT_H

#ifndef Field_H
#define Field_H
#include "CreateRow_absFac.h"
#include "observer_pattern.h"
#include <vector>
#include <string>
using namespace std;

// Template Class 
class Field{
public:
 Field(); 
 // Template method 
 void field_creator();
 virtual void setAbstractRow() = 0;
protected:
 FarmFactory *abstract_row1;
 FarmFactory *abstract_row2;
 FarmFactory *abstract_row3;

 Rows *row1 ;
 Rows *row2 ;
 Rows *row3 ;
 Sensor sensor1; 
};

При компиляции получил эту ошибку:

ld: дубликат символа Subject :: Notify (bool) в /Users/barisatamer/Desktop/se311/PROJECT/build/PROJECT.build/Debug/PROJECT.build/Objects-normal/x86_64/Field.oи /Users/barisatamer/Desktop/se311/PROJECT/build/PROJECT.build/Debug/PROJECT.build/Objects-normal/x86_64/main.o

Если я удаляю виртуальные функции, он компилируется без ошибок.В чем проблема с виртуальными функциями?

Ответы [ 3 ]

1 голос
/ 06 января 2011

На самом деле мы не можем видеть его здесь, но проблема, вероятно, в том, что вы определили Subject::notify(bool) в заголовочном файле (ваш наблюдающий.h просто объявляет, но не определяет его), и вы включили этот заголовочный файл в и Field.cpp и main.cpp, так что вы получите несколько определений. Исправление заключается в том, чтобы переместить определение в исходный файл, чтобы оно определялось только один раз.

Общее правило - ОБЪЯВЛЯЙТЕ вещи в заголовочных файлах, ОПРЕДЕЛЯЙТЕ их в исходных файлах без заголовков. Обратите внимание, что включающие охранники здесь не имеют значения - они предотвращают многократное объявление чего-либо в одном модуле компиляции, но необходимо избегать многократного определения чего-либо в разных модулях компиляции.

0 голосов
/ 06 января 2011

Видимо, у вас есть нарушение ODR.Почему вам не нравятся не виртуальные функции?Возможно, потому что вы определили их в строке (например, в классе).Как было предложено, проверьте включаемые защитные устройства и определения функций.

0 голосов
/ 06 января 2011

Попробуйте сохранить защиту заголовка даже для вашего observer.h.Кстати, почему вы не переопределяете виртуальные функции в производном классе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...