簡體   English   中英

在C ++中復制指針

[英]Copying pointers in C++

我有一個類A,其中包含兩個指向另一個類B的對象的指針。我想初始化一個或另一個指針,具體取決於將哪個指針傳遞給init() ,而init()也采用其他參數。 因此,我的情況如下:

class A {

public:
    A();
    init(int parameter, int otherParameter, B* toBeInitialized);

protected:
    B* myB;
    B* myOtherB;

};

現在,我要說的是將init()調用為:

init(640, 480, this->myB);

要么

init(640, 480, this->myOtherB);

現在,我的init被實現為:

void init( int parameter, int otherParameter, B* toBeInitialized ) {

    toBeInitialized = someConstructorFunction(parameter, otherParameter);

}

問題是兩個指針沒有初始化,我懷疑toBeInitialized被覆蓋了,但是原始參數沒有被修改。

我做錯了嗎? 我應該使用對指針的引用嗎?

謝謝
湯正雄

是的,更改為

void init( int parameter, int otherParameter, B*& toBeInitialized ) {

    toBeInitialized = someConstructorFunction(parameter, otherParameter);

}

在原始代碼中, toBeInitialized通過值傳遞,並且僅修改變量的本地副本。

這顯然是一個簡化的問題,但是如上所述,擁有這樣的東西不是更好:

class A {

public:
    A();
    B* buildB(int parameter, int otherParameter);

protected:
    B* myB;
    B* myOtherB;

};

然后將函數調用為

this->myB = buildB(640, 480);

將第三個參數轉換為對該成員的引用(或指向該成員的指針)可以正常工作,但是聞起來好像您的設計可能是錯誤的。

您正在按值傳遞toBeInitialized ,因此init()內部修改的值不會反映在外部。 您需要傳遞對toBeInitialized指針的引用或雙toBeInitialized指針。 即將init簽名更改為init(int, int, B*&)init(int,int,B**);

考慮使用指向成員的指針。 (它將為您提供更多的安全性。)

void A::init(int p1, int p2, B * A::* memberToInit)
{
    this->*memberToInit = SomeConstructorFunc(p1, p2);
}

用法是

myObject.init(480, 620, &A::myB);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM