2011-01-06 49 views
0

我有observer.h,client.h和field.h文件。多个声明错误 - 虚函数

在observer.h存在具有

// 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)in /Users/barisatamer/Desktop/se311/PROJECT/build/PROJECT.build/Debug/PROJECT.build/Objects-normal/x86_64/Field.o and/Users/barisatamer/desktop/se311/PROJECT/build/PROJECT.build/Debug/PROJECT.build/Objects-normal/x86_64/main.o

如果我删除了虚函数,它会自动编译而不会出错。虚拟功能有什么问题?

+1

你的observer.h文件中是否有include guard? – vdsf 2011-01-06 19:36:49

回答

1

我们在这里实际上看不到它,但问题可能是您在头文件中定义了Subject::notify(bool)(您的observer.h只是声明它,它没有定义它),并且您将这个头文件包含在Field.cpp和main.cpp,所以你得到了多个定义。解决方法是将定义移动到源文件中,以便只定义一次。

一般规则 - 在头文件中DECLARE东西,在非头文件源文件中定义它们。请注意,包括守卫在这里是无关紧要的 - 它们阻止在单个编译单元中多次声明某些内容,但需要避免在不同的编译单元中多次定义某些内容。

0

即使您的observer.h尝试保持标头警卫。顺便说一句,你为什么不重写派生类中的虚函数?

0

显然你有违反ODR。你为什么逃避非虚拟功能?可能是因为你将它们定义为内联(例如在课堂上)。正如所建议的那样,检查包含防护和功能定义。