从抽象 class 覆盖虚方法
Override virtual method from abstract class
我需要测试基于观察者模式的通知系统。这是我的 Observer
class:
template <typename DataType>
class Subject;
template <typename DataType>
class Observer {
public:
virtual ~Observer() {}
virtual void receive(Subject<DataType> *subject) = 0;
};
DataType
是 tparam 数据。 receive()
更新时会接收并处理Subject
调用的消息。 Subject
是指向数据来源主题的指针。
这里是 Subject
class 的一部分 attach()
方法:
template <typename DataType>
class Subject {
public:
typedef Observer<DataType> SameDataObserver;
Subject():
dataPtr_(NULL),
observers_() {
}
void attach(SameDataObserver *observerPtr) {
assert(observerPtr != NULL);
observers_.pushBack(observerPtr);
}
...
private:
...
};
所以,我写了一个Observer
摘要的继承者class。我想在这里我只需要定义 receive()
方法:
class TestObserver : Observer<IdString> {
virtual void receive(Subject<DataType> *subject) override {};
};
IdString
是 typedef String<64> IdString;
.
在我的 main()
函数中,我这样做:
const IdString data = "button pressed";
Subject<IdString> subject;
TestObserver<IdString> testObserver;
subject.attach(&testObserver);
这是我得到的错误:
[build] /home/a.wise/Downloads/test_notifying_system/test_notifying_system.cpp:20:32: error: no matching function for call to ‘Subject<String<64> >::attach(TestObserver<String<64> >&)’
[build] subject.attach(testObserver);
[build] ^
[build] In file included from /home/a.wise/Downloads/test_notifying_system/test_notifying_system.cpp:7:0:
[build] /home/a.wise/Downloads/test_notifying_system/src/notifying_system/subject.h:29:10: note: candidate: void Subject<DataType>::attach(Subject<DataType>::SameDataObserver*) [with DataType = String<64>; Subject<DataType>::SameDataObserver = Observer<String<64> >]
[build] void attach(SameDataObserver *observerPtr) {
[build] ^~~~~~
我漏了public个字,正确的代码:
template <typename DataType>
class TestObserver : public Observer<IdString> {
public:
virtual void receive(Subject<DataType> *subject) override {};
};
之后编译
我需要测试基于观察者模式的通知系统。这是我的 Observer
class:
template <typename DataType>
class Subject;
template <typename DataType>
class Observer {
public:
virtual ~Observer() {}
virtual void receive(Subject<DataType> *subject) = 0;
};
DataType
是 tparam 数据。 receive()
更新时会接收并处理Subject
调用的消息。 Subject
是指向数据来源主题的指针。
这里是 Subject
class 的一部分 attach()
方法:
template <typename DataType>
class Subject {
public:
typedef Observer<DataType> SameDataObserver;
Subject():
dataPtr_(NULL),
observers_() {
}
void attach(SameDataObserver *observerPtr) {
assert(observerPtr != NULL);
observers_.pushBack(observerPtr);
}
...
private:
...
};
所以,我写了一个Observer
摘要的继承者class。我想在这里我只需要定义 receive()
方法:
class TestObserver : Observer<IdString> {
virtual void receive(Subject<DataType> *subject) override {};
};
IdString
是 typedef String<64> IdString;
.
在我的 main()
函数中,我这样做:
const IdString data = "button pressed";
Subject<IdString> subject;
TestObserver<IdString> testObserver;
subject.attach(&testObserver);
这是我得到的错误:
[build] /home/a.wise/Downloads/test_notifying_system/test_notifying_system.cpp:20:32: error: no matching function for call to ‘Subject<String<64> >::attach(TestObserver<String<64> >&)’
[build] subject.attach(testObserver);
[build] ^
[build] In file included from /home/a.wise/Downloads/test_notifying_system/test_notifying_system.cpp:7:0:
[build] /home/a.wise/Downloads/test_notifying_system/src/notifying_system/subject.h:29:10: note: candidate: void Subject<DataType>::attach(Subject<DataType>::SameDataObserver*) [with DataType = String<64>; Subject<DataType>::SameDataObserver = Observer<String<64> >]
[build] void attach(SameDataObserver *observerPtr) {
[build] ^~~~~~
我漏了public个字,正确的代码:
template <typename DataType>
class TestObserver : public Observer<IdString> {
public:
virtual void receive(Subject<DataType> *subject) override {};
};
之后编译