为什么我的代码导致“无法实例化抽象类”?

时间:2010-01-11 10:10:58

标签: c++ observer-pattern

这是发生错误的行:

this->_tbfCmdHandler.reset(new Bar()); 
  

facade_impl.cpp(202):错误C2259:   'FOO :: Bar':不能   实例化抽象类
  由于以下成员:
  'void Subscriber :: update(T)':是   摘要与
             T = char&

     

observer.h(66)   :见声明   “用户::更新”
  与
  T = char&   'void Subscriber :: update(T)':是   摘要与
            T = const char&

     

observer.h(66)   :见声明   “用户::更新”
  与
  T = const char& ]

这是Facade :: Implementation

的声明
namespace FOO
{
class Facade::Implementation 
                :public Subscriber<const char& >                     
{

facade.cpp

FOO::Facade::Facade () : impl (new Implementation)
{

    Singleton<SPM::Facade>::instance ();
}


The update functions:
    void update( const char *aMsg)   
    {
        printf("foo");
    }; 

我希望这有助于弄清楚我在哪里可以找到错误。

6 个答案:

答案 0 :(得分:3)

您已经写完了答案。该类是抽象的,这意味着它具有纯虚方法。所以,首先必须实现这些方法。

答案 1 :(得分:2)

阅读有关polymorphism以及抽象类的内容。

摘要意味着它尚未完全定义,因此,您无法实现这一点,因为您没有找到所有部件。

这就像试图在没有引擎的情况下开车。

答案 2 :(得分:2)

尝试阅读此C ++ FAQ

答案 3 :(得分:2)

您继承自抽象类,因此需要在类Facade :: Implementation中实现void update(const char&amp;)函数。

您确实定义了更新功能,但它与订阅者无任何关系。你必须把它放在你的实现中。

答案 4 :(得分:1)

问题解决了这个问题:

我删除了void update(const char&amp; aMsg),看到还有另一个 “void update(char * aMsg)”

为什么编译器没有报告这个函数是一个奇迹...... 删除非const和指针(而不是引用)函数最终修复了问题。

答案 5 :(得分:0)

错误上标有void Subscriber<T>::update(T)' : is abstract T=char &,因此您需要定义void update(char&),而不只是void update( const RecoveryState &dummy){}