2011-01-06 25 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; 
}; 

を持っている件名クラスがあり、このエラーを得ました0

ld:重複するシンボルSubject :: Notify(bool)in /Users/barisatamer/Desktop/se311/PROJECT/build/PROJECT.build/Debug/PROJECT.build/Objects-normal/x86_64/Field.oおよび/ Users /仮想関数を削除するとエラーなしでコンパイルされます。仮想関数の問題は何ですか?

+1

observer.hファイルにインクルードガードがありますか? – vdsf

+0

投稿したコードには実際に問題の原因が含まれていません。たいていの場合、ヘッダーファイルに 'Notify'を非インラインで定義しましたが、あなたが投稿したコードにはありません。あなたの 'Notify'の定義を投稿してください。それはどこにある? – AnT

答えて

1

ここで実際には見ることはできませんが、おそらく、ヘッダファイルにSubject::notify(bool)を定義している可能性があります(observer.hは宣言していますが、定義していません)。そして、 Field.cppとmain.cppを使用すると、複数の定義が得られます。この問題を解決するには、ソースファイルに定義を移動して定義します。

一般的な規則 - ヘッダーファイル内のものを宣言し、ヘッダーファイル以外のソースファイルで定義します。インクルードガードは、ここでは無関係であることに注意してください.1つのコンパイル単位で複数のものが宣言されないようにしますが、必要なのは異なるコンパイル単位で何度も定義することを避けることです。

0

observer.hの場合でもヘッダーガードを維持してください。ところで、派生クラスで仮想関数をオーバーライドしていないのはなぜですか?

0

明らかにODR違反があります。なぜあなたは非仮想機能で逃げましたか?クラスをインラインで定義した可能性があります(クラスなど)。提案されているように、インクルードガードと関数の定義をチェックしてください。