以下是我的代码
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”。你能帮忙怎么做。
非常感谢您提前。
答案 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 ++体验更好。