【问题标题】:Why does my code result in "cannot instantiate abstract class"?为什么我的代码导致“无法实例化抽象类”?
【发布时间】:2011-01-03 16:58:26
【问题描述】:

这是发生错误的那一行:

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

facade_impl.cpp(202):错误 C2259: 'FOO::Bar' : 不能 实例化抽象类
由于以下成员:
'无效订阅者::更新(T)':是 摘要与
T=char &

观察者.h(66) : 见声明 '订阅者::更新'

T=char & '无效订阅者::更新(T)':是 摘要与
T=const 字符 &

观察者.h(66) : 见声明 '订阅者::更新'

T=const char & ]

这是 Facade::Implementation 的声明

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

外观.cpp

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

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


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

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

【问题讨论】:

  • 3 票反对对新人来说有点苛刻......只要一个就足够了。

标签: c++ observer-pattern


【解决方案1】:

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

【讨论】:

  • 我想我已经用这行代码实现了这个方法:void update(const RecoveryState &dummy){};
  • Christofer,错误信息表明编译器希望你实现一个方法void update(char&amp;)。在断定您的代码是正确的之前,请务必阅读整个错误消息。
  • 好吧,编译器显然认为你没有。现在让我们告诉你,你必须展示一些代码。
【解决方案2】:

你是从一个抽象类继承的,所以你需要在类 Facade::Implementation 中实现 void update( const char& ) 函数。

您确实定义了一个更新函数,但它与订阅者没有任何关系。你必须把它放在你的实现中。

【讨论】:

  • 这主要匹配它。 “您确实定义了一个更新函数,但它与订阅者没有任何关系”订阅者想要一个 &reVal 但有一个带有 *ptrVal 的“隐藏”实现
【解决方案3】:

阅读polymorphism 以及抽象类是什么。

抽象意味着它还没有完全定义,因此你无法实例化它,因为你没有弄清楚所有部分。

这就像试图在没有发动机的情况下启动汽车。

【讨论】:

    【解决方案4】:

    尝试阅读此 C++ FAQ

    【讨论】:

    • 链接到外部材料是一个很好的开始方式,但您至少应该报告外部材料所说的内容。
    【解决方案5】:

    这就是问题所要解决的:

    我删除了 void update( const char &aMsg),发现还有一个 “无效更新(char *aMsg)”

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

    【讨论】:

      【解决方案6】:

      错误显示void Subscriber&lt;T&gt;::update(T)' : is abstractT=char &amp;,因此您需要定义void update(char&amp;),而不仅仅是void update( const RecoveryState &amp;dummy){}

      【讨论】:

      • 还有一个用于 char 的函数: void update( char &aMsg) { printf("\n>>>>>debug msg \n"); }
      猜你喜欢
      • 2015-08-04
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2017-02-05
      • 2015-10-06
      • 1970-01-01
      相关资源
      最近更新 更多