static_cast中的C ++编译错误< >

时间:2013-01-17 13:34:22

标签: c++ compiler-errors 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 **&amp; somenum”。你能帮忙怎么做。

非常感谢您提前。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

因为C ++支持多重继承(和其他功能),A * 可转换B *但不一定相同到{ {1}}。在指针类型之间进行转换可以将指针值移动一些字节数。

因此,无法将B *转换为A **,反之亦然。从外部指针检索值后,需要进行从基础到派生的转换。

多个间接通常是一个坏主意。很难知道哪种数据结构可能有所帮助,但对标准库容器的审查可能很有见地。无论如何,感谢你凝聚这个漂亮的自成一体的例子!

答案 2 :(得分:1)

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

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

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

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

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