【发布时间】:2016-12-12 18:16:16
【问题描述】:
例如,我尝试做这样的事情:
class Animal {
public:
virtual const char *says() const = 0;
static Animal *makeLion() { return new Lion(); }
static Animal *makeTiger() { return new Tiger(); }
static Animal *makePig() { return new Pig(); }
private:
class Lion : public Animal { // error: invalid use of incomplete type ‘class Animal’
public:
virtual const char *says() const
{
return "roar";
}
};
class Tiger : public Animal { // error: invalid use of incomplete type ‘class Animal’
public:
virtual const char *says() const
{
return "meow";
}
};
class Pig : public Animal { // error: invalid use of incomplete type ‘class Animal’
public:
virtual const char *says() const
{
return "That\'s all Folks!";
}
};
};
编译器抱怨Animal 是一个不完整的类型。但是,如果不需要内部类定义来定义外部类本身(因为外部类中没有通过值声明内部类类型的非静态变量),为什么Animal 是一个不完整的类型?
有没有办法解决这个问题或有更好的方法来做我想做的事情?
【问题讨论】:
-
一堂课在你到达结束
};之前是不完整的。 -
课程在完成之前是不完整的。您尝试这样做的具体动机是什么?
-
@NathanOliver:这并不完全正确。您可以在
Animal中声明Animal的静态成员。据我所知,内部类被视为静态的。 -
@Matt 这是一个特例。它仍然是一个不完整的类型,直到完成后在类之外完成的定义。在看到
};之前,一个类本身永远不会被认为是完整的。 -
@ChristianHackl:嗯,我认为
constexprstatic数据成员的定义算作定义。这件事一团糟。我一直不明白要求和限制的原因。
标签: c++ inheritance polymorphism inner-classes