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

Object passed by reference not working as expected

本文关键字:工作 对象 引用      更新时间:2023-10-16

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

我想将树视图对象

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

我尝试通过引用传递,它进行了编译,但是通过一些调试消息,我可以判断它不是同一个对象,因此值都是空的。

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

我已经为此工作了很长时间(正如有些人已经阅读了我之前的问题),这非常令人沮丧。有人可以帮助我解决这个问题吗?

console0tree0通过引用传递到Init()中,但由于tree_console_的类型,函数内的辅助会导致参数的副本。

在此

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

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

从上面的代码来看,传递给 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);