c++ - 如何互相访问2个类的成员
问题描述
我有一个使用 C++ 制作的应用程序wxWidgets
。到目前为止,我将所有GUI
代码都放在一个文件中,但是最近我一直在尝试将应用程序的各个部分分解为它们自己的类/文件以稍微清理代码。我制作了一些自定义事件来将信息从一个类发送到另一个类,这适用于大多数事情。但是现在我遇到了一个我想不出解决方案的问题。我有这两个类,cHivesPanel
继承自wxPanel
和cListCtrl
继承自wxDataViewTreeCtrl
,它们都是不同类的一部分,分别cNotebook
继承自wxPanel
和cLibrary
继承自,这两个类最终在继承自wxPanel
的类中实例化。MainFrame
wxFrame
现在我想访问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
对象的函数的按钮,应用程序就会崩溃,并显示.cHivesPanel
cListCtrl
segmentation 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());
如果你能告诉我或指出一些可以帮助解决这个问题的代码或视频,或者帮助我更好地设计代码结构,那将是一个很大的帮助。
解决方案
推荐阅读
- feature-engineering - 使用 FeatureTools 从每日汇总每月数据
- html - Bootstrap 4卡保持缩放而不是在固定区域内调整
- .net - 停止 Visual Studio 在输出目录中复制 Nuget 包
- javascript - 强制孩子占用相同的空间但从 0、0 开始?
- javascript - 无法在嵌套地图中返回 jsx 反应 javascript
- javascript - 用于组合 Typescript 和 Javascript 项目的 Eslint 规则?
- python - Python PIL putdata 颜色必须是 int 或 tuple
- java - Firebase Cloud Messaging Android 从托盘而不是新实例打开正在运行的应用程序实例
- python - Python 3.6 将日志记录错误作为 'AttributeError: 'tuple' object has no attribute 'find''
- python - Discord.py 模拟命令