【问题标题】:Object passed by reference not working as expected通过引用传递的对象未按预期工作
【发布时间】:2012-11-12 08:10:42
【问题描述】:

我有一个包含树视图类、控制台类和选项类的程序。

我想将树视图对象传递给选项对象,并能够访问树视图内部的动态值(文件列表等)。

我试过通过引用传递,它可以编译,但是通过一些调试消息,我可以看出它不是同一个对象,所以值都是空的。

选项面板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;

main函数内调用Init

pnl_options.Init(hwnd0, pnl_console, pnl_tree);

我已经在这方面工作了很长时间(正如一些人在我之前的问题中看到的那样),这非常令人沮丧。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: c++ function object


    【解决方案1】:

    console0tree0 正在通过引用传递给 Init(),但由于 tree_console_ 的类型,函数内的赋值导致参数的副本。

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

    一种解决方案是制作类型指针并获取参数的地址。请注意,console0tree0 引用的对象必须存在,只要 PnlOptions 需要它们。

    【讨论】:

    • 好的,非常感谢,我会继续努力的。这种语言正在慢慢杀死我......一切似乎都比它应该的要困难得多......就在今天,我正在学习一些东西突然在我不知情的情况下到处被复制:p
    • Note that there is a lifetime requirement in that the objects referred to by console0 and tree0 must exist for as long as the PnlOptions requires them. 不完全确定你的意思,但我明天可能会碰壁。事情显然在我不知情的情况下被摧毁了......
    • @Steve,如果console0 引用的对象被PnlOptions 之外的东西破坏,实例有一个指向console0 的指针,那么PnlOptions 有一个dangling pointer .
    • 天啊终于明白了。那只用了4个小时。但我想这就是每个人都在谈论的“指针地狱”。更老更聪明。
    【解决方案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);
    

    【讨论】:

    • 如果对象真的像 OP 所说的那样定义,pnl_consolepnl_tree 将存在,只要 pnl_options 存在。
    • 句子顺序错误 :) “以上代码”是指原始帖子中的代码...我编辑了答案,谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-08-05
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2017-10-01
    • 2017-09-11
    相关资源
    最近更新 更多