簡體   English   中英

static_cast <>中的C ++編譯錯誤

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

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