2014-03-07 25 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文件)使其正常工作。

相關問題