[英]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.