0

以下は私のコードです

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」に割り当てようとしています。やり方を教えてください。

事前にどうもありがとうございました。

4

3 に答える 3

1

C++ は多重継承 (およびその他の機能) をサポートしているため、A *に変換できますB *が、必ずしもと同一であるとは限りませんB *。ポインターの型を変換すると、ポインターの値が数バイト移動する可能性があります。

その結果、A **を に、B **またはその逆に変換することは不可能です。ベースから派生への変換は、外部ポインターから値を取得した後に行う必要があります。

複数の間接化は、通常は悪い考えです。どのデータ構造が役立つかを知るのは難しいですが、標準ライブラリ コンテナーを確認すると、洞察が得られるかもしれません。とにかく、この素敵な自己完結型の例を要約してくれてありがとう!

于 2013-01-17T14:26:42.033 に答える
1

あなたのコンパイラはここで正しいことをしています。要するに、それはできません。同じオブジェクトを指していれば、基本クラス ポインターと派生クラス ポインターの間で変換できます。しかし、Base の配列と Derived の配列は同じものではありません

良いニュースは、あなたがやりたいことはあなたが思っているよりも簡単だということです。派生クラス ポインターは、キャストせずに基本クラス ポインターに既に暗黙的に変換されています。2 つの配列のサイズが分かっていて、サイズが同じであると仮定すると、単純なループになります。

// Given:
A** someNumbers;
B** someValues;

for (int i = 0; i < size; ++i) {
    *someNumbers[i] = *someValues[i];
}

また、この種の問題は、 vectorのような標準コンテナーがある理由です。何人かの本当に頭のいい人が、このポインターの狂気をすでに解決してくれています。それを利用することを強くお勧めします。これにより、C++ エクスペリエンスが大幅に向上します。

于 2013-01-17T14:26:45.250 に答える
1
void C::getNum(A**& somenum)
{
  dObj->getNumber(static_cast<B**>(somenum)); // Error here.
}

static_cast関連するクラスへのポインター間の変換を実行するため、または暗黙的に実行できるその他の非ポインター変換を実行するために使用されます。上記の例ではそうではありません。そのため、static_castここでは使用できません。

于 2013-01-17T14:24:39.960 に答える