我的应用程序中有一个设计问题。我对虚拟方法,继承等概念还很陌生,并且无法使其正常运行。

这种情况:

我有一个名为UI_Brainwash(纯巧合)的类,其中嵌套了一个第二类SoundReciver。

class UI_BRAINWASH : public wxDialog
{
public:
    UI_BRAINWASH(wxWindow* parent,const wxString& title,double sec);
    virtual ~UI_BRAINWASH();

    void OnTimer(wxTimerEvent& event);
    void StartLoop();

    class Soundreciver : public irrklang::ISoundStopEventReceiver
    {
                Soundreciver();
        // why is this not allowed?!
                Soundreciver(UI_BRAINWASH* par){this->parent = par;}
        virtual void OnSoundStopped(ISound* sound, E_STOP_EVENT_CAUSE reason, void* userData);

    public: // or private: doesn't change it -> compiler still complains
        UI_BRAINWASH* parent;

    };

private:
    wxTimer* m_timer;


在我的Brainwash类中,我播放声音,并在播放声音后调用OnSoundStopped(),这是抽象irrklang :: ISoundStopEventReceiver类的虚拟方法。

http://www.ambiera.com/irrklang/docu/classirrklang_1_1_i_sound_stop_event_receiver.html

在这种方法中,我想启动一个wxTimer,它是UI_Brainwash类的成员,问题是我无法在没有该类的句柄的情况下访问该类的变量(或者我可以吗?),所以我想到了编写一个构造函数:

Soundreciver(UI_BRAINWASH * par){this-> parent = par;}

但是当我使用VC2008进行编译时,出现以下错误:

UI_BRAINWASH :: Soundreciver :: Soundreciver':无法访问在类'UI_BRAINWASH :: Soundreciver'中声明的私有成员
:请参阅“ UI_BRAINWASH :: Soundreciver :: Soundreciver”的声明
:请参阅“ UI_BRAINWASH :: Soundreciver”的声明

我该如何解决这个难题?

谢谢您的时间/建议

最佳答案

您得到的消息不是有关访问私有变量parent的消息,而是有关访问Soundreceiver的构造函数的消息。您需要将您的Soundreceiver构造函数公开。

class Soundreciver : public irrklang::ISoundStopEventReceiver
{
 public:
    Soundreciver();
    // why is this not allowed?!
    Soundreciver(UI_BRAINWASH* par){this->parent = par;}
    virtual void OnSoundStopped(ISound* sound, E_STOP_EVENT_CAUSE reason, void* userData);

 private: // or private: doesn't change it -> compiler still complains
    UI_BRAINWASH* parent;

};


Vlad所指出的,另一种方法是声明UI_BRAINWASH类的friend Soundreciver

关于c++ - 嵌套类设计C++虚拟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20082081/

10-14 21:50