1

ツリービュー クラス、コンソール クラス、およびオプション クラスを含むプログラムがあります。

ツリービュー オブジェクトをオプション オブジェクトに渡し、ツリービュー内の動的な値 (ファイル リストなど) にアクセスできるようにしたいと考えています。

参照渡しを試みたところ、コンパイルされましたが、いくつかのデバッグ メッセージから、同じオブジェクトではないことがわかりました。そのため、値はすべて空です。

オプション パネル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);

私はこれに長い間取り組んできました (以前の質問を読んだ人もいます) が、非常にイライラしています。誰かがこれを機能させるのを手伝ってくれますか?

4

2 に答える 2

4

console0tree0は参照によって に渡されますInit()が、 と の型により、関数内の代入は引数のコピーにtree_なりconsole_ます。

はコンストラクターではなく、参照型はすぐに (コンストラクター初期化子リストで) 割り当てる必要があるため、このコンテキストでtree_andの型を変更することはできません。console_Init()

解決策は、型をポインターにして、引数のアドレスを取ることです。console0およびによって参照されるオブジェクトは、 によってtree0必要とされる限り存在しなければならないという点で、存続期間の要件があることに注意してPnlOptionsください。

于 2012-11-12T08:14:07.037 に答える
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);
于 2012-11-12T08:14:42.977 に答える