Публичная структура внутри класса - PullRequest
4 голосов
/ 30 мая 2010

Я новичок в C ++, и скажем, у меня есть два класса: Creature и Human:

/* creature.h */
class Creature {
private:
public:
    struct emotion {
        /* All emotions are percentages */
        char joy;
        char trust;
        char fear;
        char surprise;
        char sadness;
        char disgust;
        char anger;
        char anticipation;
        char love;
    };
};

/* human.h */
class Human : Creature {

};

И у меня это есть в моей основной функции в main.cpp:

Human foo;

Мой вопрос: как мне настроить эмоции foo? Я попробовал это:

foo->emotion.fear = 5;

Но GCC выдает мне эту ошибку компиляции:

ошибка: базовый операнд '->' имеет тип без указателя 'Human'

Это:

foo.emotion.fear = 5;

Дает:

ошибка: 'struct Creature :: emotion' недоступна
ошибка: в этом контексте
ошибка: неверное использование 'struct Creature :: emotion'

Кто-нибудь может мне помочь? Спасибо


P.S. Нет, я не забыл #include с

Ответы [ 4 ]

12 голосов
/ 30 мая 2010

Нет переменной типа emotion. Если вы добавите emotion emo; в определение вашего класса, вы сможете получить доступ к foo.emo.fear так, как вы хотите.

7 голосов
/ 30 мая 2010
 class Human : public Creature {

C ++ по умолчанию является частным наследованием для class es.

3 голосов
/ 30 мая 2010

Измените наследование на public и определите член struct emotion в классе Creature (ex. Emo).

Таким образом, вы можете создавать экземпляры объектов класса Human (например, foo) и присваивать значения его членам, например

foo.emo.fear = 5;

или

foo->emo.fear = 5;

Код изменен:

/* creature.h */
class Creature {
private:
public:
    struct emotion {
        /* All emotions are percentages */
        char joy;
        char trust;
        char fear;
        char surprise;
        char sadness;
        char disgust;
        char anger;
        char anticipation;
        char love;
    } emo;
};

/* human.h */
class Human : public Creature {

};
1 голос
/ 30 мая 2010

Creature::emotion - это тип, а не переменная.Вы делаете эквивалент foo->int = 5;, но с вашим собственным типом.Измените определение структуры на это, и ваш код будет работать:

struct emotion_t {  // changed type to emotion_t
        // ...
    } emotion;      // declaring member called 'emotion'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...