[英]C++ compilation error in static_cast< >
下面是我的代碼
Class A
{
A::A(int num) { }
int num;
};
class B : public A
{
B::B(int num):A(num) { }
};
Class D;
Class C
{
void getNum(A**& somenum) {}
D *dObj;
};
void C::getNum(A**& somenum)
{
dObj->getNumber(static_cast<B**>(somenum)); // Error here.
}
Class D
{
void getNumber(B**& number)
{
B someValue[5];
// all the objects in the array are properly created and properly Initalized (skipped that part)
number[0] = someValue[0];
number[1] = someValue[1];
//...
}
};
執行static_cast時出現編譯錯誤。 我正在嘗試將“ someValue”數組中的值分配給“ A **&somenum”。 你能幫忙怎么做嗎?
提前非常感謝您。
void C::getNum(A**& somenum)
{
dObj->getNumber(static_cast<B**>(somenum)); // Error here.
}
static_cast
用於在指向相關類的指針之間執行轉換,或執行也可以隱式執行的任何其他非指針轉換。 在上面的示例中情況並非如此。 所以這就是為什么static_cast
不能在這里使用的原因。
因為C ++支持多重繼承(和其他功能),所以A *
可轉換為B *
但不一定與 B *
相同 。 在指針類型之間進行轉換可能會使指針值移動一定數量的字節。
結果,不可能將A **
轉換為B **
,反之亦然。 從外部指針檢索值之后,將需要進行從基數到源的轉換。
多次間接訪問通常不是一個好主意。 很難知道哪種數據結構可能會有所幫助,但是對標准庫容器的回顧可能會很有見地。 無論如何,感謝您總結這個很好的獨立示例!
您的編譯器在這里做正確的事。 簡而言之, 您不能那樣做 。 您可以在基類指針和派生類指針之間進行轉換,前提是它們指向同一對象。 但是,Base-of-Base和Derived數組不是一回事 。
好消息是您想要做的比您想的要容易。 派生類指針已隱式轉換為基類指針,而無需強制轉換。 假設您知道兩個數組的大小,並且大小相同,這是一個簡單的循環:
// Given:
A** someNumbers;
B** someValues;
for (int i = 0; i < size; ++i) {
*someNumbers[i] = *someValues[i];
}
同樣,這種問題就是為什么我們有像vector這樣的標准容器。 一些真正聰明的人已經為您解決了這種指針瘋狂問題。 我強烈建議您利用它。 它將使您的C ++體驗更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.