返回自身内部的双重嵌套类的成员函数,该类继承自从自身继承的类

Member function that returns a doubly-nested class inside itself which inherited from a class inherited from itself

本文关键字:继承 函数 嵌套 内部 返回 成员      更新时间:2023-10-16

>假设我有 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 {
};
};