我有一个带有treeview类,控制台类和选项类的程序。
我想将treeview对象传递给options对象,并且能够访问treeview中的动态值(文件列表等)。
我尝试通过引用传递它并编译,但通过一些调试消息,我可以告诉它不是同一个对象,所以值都是空的。
选项面板Init
标题:
public:
void Init (HWND, PnlConsole&, PnlTree&);
...
private:
PnlTree tree_;
PnlConsole console_;
...
选项面板Init
功能:
void PnlOptions::Init(HWND hwnd0, PnlConsole& console0, PnlTree& tree0) {
tree_ = tree0;
console_ = console0;
...
main
文件中的类实例化:
PnlTree pnl_tree;
PnlOptions pnl_options;
PnlConsole pnl_console;
在Init
函数内调用main
:
pnl_options.Init(hwnd0, pnl_console, pnl_tree);
我已经在这方面工作了很长时间(因为有些人已经读过我以前的问题)并且非常令人沮丧。有人可以帮我搞定吗?
答案 0 :(得分:4)
console0
和tree0
通过引用传递到Init()
但由于tree_
和{的类型,函数中的分配会产生参数的副本{1}}。
在此上下文中无法更改console_
和tree_
的类型,因为console_
不是构造函数,必须立即分配引用类型(在构造函数初始化列表中)
解决方案是创建类型指针并获取参数的地址。请注意,只要Init()
需要console0
和tree0
引用的对象,就必须存在生命周期要求。
答案 1 :(得分:2)
从上面的代码中,传递给init的pnl_console和pnl_tree似乎是结构,因此当存在具有Init函数的块时,它们只会存在时间。
在您的Init功能中,您通过&传递参考,但将其分配给结构。我建议,用*
传递它 void PnlOptions::Init(HWND hwnd0, PnlConsole * console0, PnlTree * tree0)
PnlTree * pnl_tree;
PnlOptions pnl_options;
PnlConsole * pnl_console;
pnl_options.Init(hwnd0, &pnl_console, &pnl_tree);