>假设我有 3 个具有以下拓扑结构的类,实际代码是这样的:
// formal system.h
#pragma once
namespace nianyi {
class Proposition {
public:
class Term;
class Expression;
// Term::Value evaluate();
};
class Proposition::Term : public Proposition {
public:
class Variable;
class Value;
};
class Proposition::Term::Value : public Proposition::Term {
};
};
很容易看出,如果我取消注释该函数声明,编译器将抱怨未预先定义的类 Value,事实上它确实如此:
error C2027: use of undefined type 'nianyi::Proposition::Term'
但另一方面,类Term
派生自其基类Proposition
,这意味着我不能将其实现放在基类中,因为在实现结束之前它不是一个完整的类,并且不能派生不完整的类。
因此,将类Term
的实现放在类Proposition
的内部和外部都会导致编译器错误。内部一个是由基类的不完备性引起的,外部一个是由导数的不完备性引起的。
那么......解决这个问题的最佳方法是什么?
附言请停止告诉"你应该在使用类之前完成定义"或"只是不要让它们嵌套"。 对于第一个词,这就是整个问题,简单地告诉这个并没有多大帮助; 对于第二种词,我只是打算将它们嵌套起来,以免暴露这些细节。
这应该有效,不清楚它是否是你想要的
class Proposition {
public:
};
class Term : public Proposition {
public:
class Variable {};
class Value {};
};
class Value : public Term {
};
这是一个抽象的解决方案。 无需继承。
class Variable{
};
class Value{
};
class Term{
class Variable;
class Value;
};
class Expression{
class Variable;
class Value;
};
class Proposition{
class Expression;
class Term;
};
似乎没有人在你的问题标题中谈到返回一个"自我内部的双重嵌套类"的观点。 我最近看到通过创建类的私有(或公共,如果您愿意(成员和类的指针实例来完成了很多工作。这样,您可以生成指向此成员的类并返回指针。
// formal system.h
#pragma once
namespace nianyi {
class Proposition {
public:
class Term;
class Expression;
// Term::Value evaluate();
Proposition( )
{
Proposition *pinstance;
prop_ = pinstance;
}
private:
Proposition *prop_;
};
class Proposition::Term : public Proposition {
public:
class Variable;
class Value;
};
class Proposition::Term::Value : public Proposition::Term {
};
};