Помешает ли частный спецификатор типа объектам «понять» спецификатор? - PullRequest
3 голосов
/ 06 августа 2011

У меня возникла проблема с получением функции для принятия перечисления в качестве возвращаемого типа. В приведенном ниже коде есть перечисление:

Status{ DEAD, WOUNDED, HEALTHY }

и функция с Status в качестве типа возврата:

Status getStatus();

Код заголовка:

class Discovery
{
public:
    void doCombat( int );
    void setCombatThreshold( int );
    void setHealth( int );
    void setStatus( int );
    Status getStatus();
private:
    enum Status { DEAD, WOUNDED, HEALTHY };
    Status charStatus;
    int yourHealth;
    int combatThreshold;
};

Первоначально определение связанной функции читалось:

Status Discovery::getStatus()
{
    switch ( charStatus )
    {
    case DEAD:
        return DEAD;
        break;
    case WOUNDED:
        return WOUNDED;
        break;
    case HEALTHY:
        return HEALTHY;
        break;
    };
}

Я нашел ответ: возвращение enum из функции в базовом классе C ++ , который помог мне понять, что мне действительно нужна первая строка функции для чтения:

Discovery::Status Discovery::getStatus()

Но я все еще получаю сообщение об ошибке «отсутствует указатель типа» для моего кода заголовка. Я понял, что наличие объявления enum Status в приватном спецификаторе доступа может иметь значение, поэтому я переместил его в публичный спецификатор доступа в своем коде заголовка. Это сработало! Но я бы хотел пояснить, почему он не работает под спецификатором частного доступа. То, что мне удалось найти в другом месте:

Объекты класса не могут получить доступ к частным элементам данных.

Моя интерпретация произошедшего - с определением типа enum в приватном спецификаторе доступа, функция (и, в конечном итоге, объект, вызывающий эту функцию) не может получить доступ к «пониманию» моего типа enum и, следовательно, принять это как тип возврата.

Но - если это так, почему мне разрешено возвращать переменные, объявленные в приватном спецификаторе доступа с той же проблемой? Это потому, что их типы уже понятны в других местах, и поэтому программа без проблем принимает их?

Ответы [ 2 ]

4 голосов
/ 06 августа 2011

Вам необходимо изменить порядок объявлений.Поскольку вы используете Status до того, как он будет объявлен, он выдаст вам ошибку.Вы должны переместить декларацию статуса вверх.

class Discovery
{
private:
    enum Status { DEAD, WOUNDED, HEALTHY };
public:
    void doCombat( int );
    void setCombatThreshold( int );
    void setHealth( int );
    void setStatus( int );
    Status getStatus();
private:
    Status charStatus;
    int yourHealth;
    int combatThreshold;
};
4 голосов
/ 06 августа 2011

Статус определяется после его использования.Переместите состояние вверх перед методом get.

Если вы планируете использовать перечисление вне класса, вы захотите переместить перечисление в общедоступную область.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...