这个编译很好,虽然我不想尝试运行它。但是......
//class base;
//class derived;
//class derived : public base;
class base {};
class derived : public base {};
class other
{
public:
void func() {base1 = derived1;}
base* base1;
derived* derived1;
};
void main()
{
}
...将其他类移动到base的定义之上并派生出来,我必须在myne程序中执行类似的操作会导致编译错误。
显而易见的解决方案是在代码顶部转发声明base和派生显示的注释,但这会导致无法在base *和derived *错误之间进行转换。尝试转发声明包括继承信息也不起作用。
答案 0 :(得分:9)
这应该有效。你需要移动其他人
但是在下面声明func。这样func就能“看到”派生的类型为base。
如,
class base;
class derived;
//class derived : public base;
class other
{
public:
void func();
base* base1;
derived* derived1;
};
class base {};
class derived : public base {};
void other::func() { base1 = derived1; }
答案 1 :(得分:4)
没有语法可以向前声明两个类并指定一个继承自另一个类。这是因为继承可能很复杂(多个和/或虚拟),因此赋值base1 = derived1
可能涉及一些算术,当编译器只知道derived
时,很难/不可能生成算术继承自base
。
因此,要解决您的问题,您可以使func
不内联(请参阅 AbstractDissonance 的答案),或者,如果您绝对需要内联,请使用{{1 }}:
reinterpret_cast
这很糟糕,因为它不能保证按C ++标准工作,如果使用多个/虚拟继承,它几乎肯定不会起作用。仅当class base;
class derived;
class other
{
public:
void func() {base1 = reinterpret_cast<base*>(derived1);}
base* base1;
derived* derived1;
};
必须尽可能快(即内联),并且如果您不需要您的代码可移植时,请使用此选项。