我有Observer.h,client.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:/Users/barisatamer/Desktop/se311/PROJECT/build/PROJECT.build/Debug/PROJECT.build/Objects-normal/x86_64/Field.o和/ Users / barisatamer /中的重复符号Subject :: Notify(bool)桌面/se311/PROJECT/build/PROJECT.build/Debug/PROJECT.build/Objects-normal/x86_64/main.o

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

最佳答案

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

一般规则-在头文件中声明内容,在非头文件中定义它们。请注意,这里没有包含保护-它们可以防止在单个编译单元中多次声明某些内容,但是需要避免在不同的编译单元中多次定义某些内容。

关于c++ - 多个声明错误-虚拟函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4618901/

10-11 22:43
查看更多