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
void C::getNum(A**& somenum)
{
  dObj->getNumber(static_cast<B**>(somenum)); // Error here.
}

static_cast用于执行指向相关类的指针之间的转换,或执行任何其他也可以隐式执行的非指针转换。在您的上述示例中并非如此。所以这就是为什么static_cast不能在这里使用。

于 2013-01-17T14:24:39.960 回答
1

因为 C++ 支持多重继承(和其他特性),所以 aA *可以转换为 aB *但不一定a相同B *。在指针类型之间进行转换可以将指针值移动一些字节。

因此,不可能将 a 转换A **为 a B **,反之亦然。在从外部指针检索值之后,需要进行基数到派生的转换。

多重间接通常是一个坏主意。很难知道哪种数据结构可能会有所帮助,但是对标准库容器的回顾可能会很有见地。无论如何,感谢您浓缩了这个不错的独立示例!

于 2013-01-17T14:26:42.033 回答
1

您的编译器在这里做正确的事情。简而言之,你不能那样做。您可以在基类指针和派生类指针之间进行转换,前提是它们指向同一个对象。但是基数组和派生数组不是一回事

好消息是你想做的事情比你想象的要容易。派生类指针已经隐式转换为基类指针而不进行强制转换。假设您知道两个数组的大小,并且大小相同,这是一个简单的循环:

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

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

此外,这类问题也是为什么我们有像vector这样的标准容器。一些非常聪明的人已经为你解决了这个指针疯狂问题。我强烈建议利用它。它会让你的 C++ 体验好很多。

于 2013-01-17T14:26:45.250 回答