Функция-член, которая возвращает внутри себя дважды вложенный класс, унаследованный от класса, унаследованного от самого себя - PullRequest
0 голосов
/ 08 июня 2018

Скажем, у меня есть 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 приведет к ошибке компилятора.Внутренний вызван неполнотой базового класса, а внешний - неполнотой производной.

Итак ... как лучше это решить?


PS пожалуйста, прекратите говорить «вы должны завершить определение перед использованием класса» или «просто не делайте их вложенными».Для первых слов, , в этом вся проблема , просто сказать, что это не очень помогает;и что касается слов второго рода, я просто хотел сделать их вложенными, чтобы не раскрывать эти детали.

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Вот абстрактное решение.Нет необходимости в наследстве.

class Variable{
};
class Value{
};
class Term{
   class Variable;
   class Value;
};
class Expression{
   class Variable;
   class Value;
};
class Proposition{
  class Expression;
  class Term;
};
0 голосов
/ 08 июня 2018

Кажется, никто не обращает внимания на пункт в вашем вопросе, который говорит о возвращении «дважды вложенного класса внутри себя».В последнее время я видел, как это делается, делая закрытым (или публичным, если хотите) членом класса и указателем экземпляра класса.Таким образом, вы можете генерировать и возвращать указатель на класс для этого члена.

// 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 {
    };
};
0 голосов
/ 08 июня 2018

Это должно работать, не ясно, если вы хотите, хотя

class Proposition {
public:

};

class Term : public Proposition {
public:
    class Variable {};
    class Value {};
};

class Value : public Term {

};
...