2011-01-06 96 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。你爲什麼逃避非虛擬功能?可能是因爲你將它們定義爲內聯(例如在課堂上)。正如所建議的那樣,檢查包含防護和功能定義。