Предоставить общедоступное перечисление внутреннего класса из класса-оболочки - PullRequest
2 голосов
/ 09 августа 2011

У меня такая ситуация:

class Inner
{
public:
    enum myEnum;
    myEnum getInnerEnumValue();
};

class Outer
{
private:
    Inner myInner;
public
    Inner::myEnum getOuterEnumValue()
    {
        return myInner.getInnerEnumValue();
    }
};

Класс Inner - это довольно низкоуровневая оболочка для аппаратного API, а класс Outer - дополнительный уровень, обеспечивающий более приятные интерфейсы для некоторых функций ипереводить между различными структурами данных.Я хочу, чтобы внешний мир использовал Outer и забыл о Inner.

Однако Inner определяет метод enum и getter, это именно то, что мне нужно для получения определенной информации.Я хотел бы использовать это перечисление как тип возврата из Outer, просто передавая его напрямую.Но если я объявлю функцию getEnumValue(), как показано выше, я нарушу инкапсуляцию, заставив внешний мир включить файл заголовка для Inner.

Как я могу поднять определение enum из Inner, не переписывая идентичный код, ипредставить его как публичное перечисление Outer?

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Я предлагаю просто предоставить typedef в вашем внешнем классе.Что-то вроде:

class Outer {
public:
    typedef Inner::myEnum myEnum;

    myEnum getInnerEnumValue();
};

Или же вы можете использовать частное наследование (это может работать немного лучше):

class Outer : private Inner {
public:
    using Inner::myEnum;

    myEnum getInnerEnumValue();
};

По крайней мере, потребители вашего класса не будут напрямую зависит от внутреннего класса.В будущем вы будете свободны заменить typedef собственным перечислением (при необходимости).Потребителям все равно придется включить заголовочный файл класса Inner, но нет никакого способа обойти это.

0 голосов
/ 09 августа 2011

Переместить перечисление из class Inner в новый заголовочный файл (возможно, даже в отдельное пространство имен)

EDIT

Поскольку вы хотите сохранить интерфейс Inner (если я правильно понял), добавьте для него чистый базовый класс и определите enum там.

...