首页 > 解决方案 > 如何互相访问2个类的成员

问题描述

我有一个使用 C++ 制作的应用程序wxWidgets。到目前为止,我将所有GUI代码都放在一个文件中,但是最近我一直在尝试将应用程序的各个部分分解为它们自己的类/文件以稍微清理代码。我制作了一些自定义事件来将信息从一个类发送到另一个类,这适用于大多数事情。但是现在我遇到了一个我想不出解决方案的问题。我有这两个类,cHivesPanel继承自wxPanelcListCtrl继承自wxDataViewTreeCtrl,它们都是不同类的一部分,分别cNotebook继承自wxPanelcLibrary继承自,这两个类最终在继承自wxPanel的类中实例化。MainFramewxFrame

现在我想访问cHivesPanel类中的cListCtrl类成员,也想使用cListCtrl类中的cHivesPanel类成员。

我该如何解决这个问题?因为两者cHivesPanel都有作为参数的cListCtrl构造函数wxWindow*,用于确定它们的父窗口。并且不可能在彼此中创建这些类的对象,因为它们都有不同的父窗口。

HivesPanel.hpp

class cHivesPanel : public wxPanel
{
    public:
        cHivesPanel(wxWindow* window);
        ~cHivesPanel();

    public:
        wxDataViewTreeCtrl* GetHivesObject() { return m_pHives; }
        wxDataViewItem GetFavoritesHive() { return m_FavoritesHive; }

    private:
        wxDataViewItem m_FavoritesHive;
        wxDataViewTreeCtrl* m_pHives = nullptr;
}

cListCtrl.hpp

class cListCtrl : public wxDataViewListCtrl
{
    public:
        cListCtrl(wxWindow* window);
        ~cListCtrl();

    public:
        wxDataViewListCtrl* GetListCtrlObject() { return this; }
}

主框架.cpp

MainFrame::MainFrame()
    : wxFrame(NULL, wxID_ANY, "SampleHive", wxDefaultPosition)
{
    // some code...

    m_Notebook = new cNotebook(m_BottomSplitter);
    m_Library = new cLibrary(m_BottomSplitter);

    m_Library->SetHivesObject(*m_Notebook->GetHivesPanel()->GetHivesObject());
    m_Library->SetFavoritesHive(m_Notebook->GetHivesPanel()->GetFavoritesHive());
    m_Library->SetTrashObject(*m_Notebook->GetTrashPanel()->GetTrashObject());
    m_Library->SetTrashRoot(m_Notebook->GetTrashPanel()->GetTrashRoot());

    m_Notebook->SetListCtrlObject(*m_Library->GetListCtrlObject());
}

使用这个应用程序编译并运行良好,但只要我点击触发需要从类中的类中说出Hives对象的函数的按钮,应用程序就会崩溃,并显示.cHivesPanelcListCtrlsegmentation fault

我也试过这样的东西, Library.cpp

cLibrary::cLibrary(wxWindow* window, wxDataViewItem favHive, wxDataViewTreeCtrl& hives,
                   wxTreeItemId trashRoot, wxTreeCtrl& trash)
    : wxPanel(window, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
      m_FavoritesHive(favHive), m_pHives(hives), m_pTrash(trash), m_TrashRoot(trashRoot)
{
}

笔记本.cpp

cNotebook::cNotebook(wxWindow* window, wxDataViewListCtrl& listCtrl)
    : wxPanel(window, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
      m_pListCtrl(listCtrl)
{
}

但是我不能在MainFrame.cpp中执行此操作

    m_Library = new cLibrary(m_BottomSplitter,
                             m_Notebook->GetHivesPanel()->GetFavoritesHive(),
                             *m_Notebook->GetHivesPanel()->GetHivesObject(),
                             m_Notebook->GetTrashPanel()->GetTrashRoot(),
                             *m_Notebook->GetTrashPanel()->GetTrashObject());

    m_Notebook = new cNotebook(m_BottomSplitter, *m_Library->GetListCtrlObject());

如果你能告诉我或指出一些可以帮助解决这个问题的代码或视频,或者帮助我更好地设计代码结构,那将是一个很大的帮助。

标签: c++wxwidgets

解决方案


推荐阅读