通过引用传递的对象未按预期工作

时间:2012-11-12 08:10:43

标签: c++ function object

我有一个带有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);

我已经在这方面工作了很长时间(因为有些人已经读过我以前的问题)并且非常令人沮丧。有人可以帮我搞定吗?

2 个答案:

答案 0 :(得分:4)

console0tree0通过引用传递到Init()但由于tree_和{的类型,函数中的分配会产生参数的副本{1}}。

在此上下文中无法更改console_tree_的类型,因为console_不是构造函数,必须立即分配引用类型(在构造函数初始化列表中)

解决方案是创建类型指针并获取参数的地址。请注意,只要Init()需要console0tree0引用的对象,就必须存在生命周期要求。

答案 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);