2014-03-07 26 views
1

我在公共递归中有一个调用受保护虚函数的问题。在基类崩溃中调用虚拟函数

我想有一个基地类调​​用递归函数getAllStrings(),这一次则在它的“孩子”的所有项目调用虚拟的getString()功能名单。
getString()方法只在其某些子类中实现。

// Base.hpp

class Base 
{ 
private: 
    // SharedBase is a typedef boost::shared_ptr<Base> 
    std::list<SharedBase> baseList; 

protected: 
    virtual std::string getString() const 
    { 
     return ""; 
    }; 

public: 
    Base(){} 
    virtual ~Base(){} 

    void addElmtToList(SharedBase sb) 
    { 
     baseList.push_back(sb); 
    } 

    // recursive 
    void getAllStrings(std::string &returnedString) 
    { 
     if (!baseList.empty()) 
     { 
      // Iterate through all children 
      std::list<SharedBase>::iterator itBase = baseList.begin(); 
      while (itBase != baseList.end()) 
      { 
       (*itBase)->getAllStrings(returnedString); 
       ++itBase; 
      } 
     } 

     returnedString += getString(); // ERROR ! 
    } 

}; 

// Derived_a.hpp

class Derived_a : public Base 
{ 
public: 
    Derived_a(); 
    virtual ~Derived_a(); 

protected: 
    std::string getString() const 
    { 
     return "derived_a string"; 
    } 
}; 

// Derived_b.hpp

class Derived_b : public Base 
{ 
public: 
    Derived_b(); 
    virtual ~Derived_b(); 
}; 

所以basicaly应用呼吁getAllStrings( )和一切工作正常,除了呼吁getString(),这使应用程序崩溃。

简单地调用的getString()功能,无需任何递归性(发表意见如果块),使应用程序崩溃反正。

把它变成非虚拟的使它工作,但在这种情况下功能是无用的,所以我有点失落。为什么会崩溃?

编辑10/03:增加了SSCCE here。基于Synxis代码。在我的电脑上使用Boost链接。所以我想这确实与我们的应用程序环境有关。

+2

它如何崩溃?调试告诉你什么?你能证明你是如何称呼它的吗?理想情况下,提供[SSCCE](http://www.sscce.org/)。 – Angew

+1

不相关,但你的'if(!baseList.empty())'行是完全多余的。 –

+0

@Angew:由于使用某些.dll,调试在项目中不起作用。我得到的唯一错误是“无效句柄”。 – eMixam

回答

0

我终于解决了这个问题。

我制成的迹线与DrMinGW表示的信号在ntdll.dll!RtlUlonglongByteSwap

然而,没有信号在功能使用之前段错误调用。

这里是罪魁祸首:

//在“base.hpp”文件

protected: 

    /// Some useful type definition for the signal to emit when the 
    /// configuration changes. 
    typedef boost::signals2::signal<void()> OnConfigurationUpdated; 

    virtual std::string getString() 
    { 
     return ""; 
    } 

public: 
    /// Signal that subscribers have to connect to if they want to be alerted 
    /// about the configuration changes. 
    OnConfigurationUpdated reactOnChanges; 

该项目采用从所在班被导入另一个项目序列化。但是,这个项目不是用GUI重建的。从序列化项目中正确清理(删除.o和.dll文件)使其正常工作。

相关问题