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

时间:2018-06-08 02:59:45

标签: c++ inheritance compiler-errors inner-classes code-structure

假设我有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会导致编译器错误。内部的一个是由基类的不完整引起的,而外部的一个是由导数的不完整引起的。

那么......解决这个问题的最佳方法是什么?

P.S。请停止告诉“你应该在使用类之前完成定义”或“只是不要让它们嵌套”。 对于第一个单词,这就是那里的整个问题,简单地告诉它并没有多大帮助; 而对于第二种话,我只是想让它们嵌套而不是暴露这些细节。

3 个答案:

答案 0 :(得分:0)

这应该有效,但不清楚它是否是你想要的

server {
  server_name abc.com;
  location / {
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  Host       $http_host;
    proxy_pass        http://node;
  }
}

upstream node {
    server 127.0.0.1:8000;
}

答案 1 :(得分:0)

这是一个抽象的解决方案。 不需要继承。

class Variable{
};
class Value{
};
class Term{
   class Variable;
   class Value;
};
class Expression{
   class Variable;
   class Value;
};
class Proposition{
  class Expression;
  class Term;
};

答案 2 :(得分:0)

似乎没有人在你的问题标题中谈到关于在其自身内部返回“双重嵌套类”的问题。 我最近通过创建类的一个私有(或公共,如果你喜欢)成员和类的指针实例看到了这一点。这样,您就可以生成并向该成员返回指向该类的指针。

// 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 {
    };
};