C ++ Идентификатор "_var" не определен - PullRequest
2 голосов
/ 20 мая 2011

Я пытаюсь выучить C ++ (в настоящее время знаю только PHP и немного C #) и столкнулся с моей первой проблемой.

Я пытаюсь вызвать класс внутри коммутатора, а затем использовать эту определенную переменную после коммутатора. Однако я получаю сообщение об ошибке, описанное в заголовке.

#include <iostream>
#include <string>

using namespace std;

class Hero {
protected:
    int hHealth,hStamina,hExp;
    string hName;
public:
    void Create(string);
    string GetName() {
        return this->hName;
    }
};

class Wizard:public Hero {
public:
    void SetStats(string hName) {
        this->hName = hName;

        this->hHealth = 40;
        this->hStamina = 80;
    }

};

int main() {
    string hName;
    int hClass;


    cout << "Welcome to Ryan's Dungeons & Dragons Adventure!\n\n";
    cout << "Enter your Heroes name\n";
    cout << "Name: ";
    cin >> hName;

    cout << hName << ", please select your class\n";
    cout << "(1) The Wizard\n";
    cout << "(2) The Warrior\n";
    cout << "(3) The Rogue\n";
    cout << "(4) The Priest\n";

    cout << "Class: ";
    cin >> hClass;

    switch (hClass) {
    case 1:
        Wizard _hero;
        break;
    }

    cout << _hero->GetName();


    system("PAUSE");
    return 0;
}

Ошибка возникает в строке:

cout << _hero-> getName ();

, где говорится, что герой не определен.

Ответы [ 5 ]

4 голосов
/ 20 мая 2011

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

Один из способов обойти это - определить указатель на Hero перед switch (инициализация null) и затем установите его в значение внутри switch.Например:

Wizard *_hero = NULL;
switch (hClass) {
    case 1:
        _hero = new Wizard();
        break;
    }
}

if (_hero) {
    cout << _hero->GetName();
}

Вы также используете -> для значения класса (в отличие от указателя на единицу).Помимо проблем с областью, вы, вероятно, намеревались написать _hero.GetName().Внутри вашего класса -> прав, однако, this является указателем на ваш объект.

3 голосов
/ 20 мая 2011
switch (hClass) {
    case 1:
        Wizard _hero;
        break;
} // <-- _hero is deallocated at this point

cout << _hero->GetName();

Область действия _hero ограничена оператором switch.

1 голос
/ 20 мая 2011

Вы сказали, что знаете немного C # и php, чего я не знаю. Я просто хочу знать, как бы это вело себя в C #.

Создание объекта внутри некоторой области и использование его вне области. Как: {int a;} a = 0;

В C ++ это проблема.

    switch (hClass) {
    case 1:
        Wizard _hero;
        break;
    }
//At this no _hero is present. _hero is out of its scope
1 голос
/ 20 мая 2011

Я не думаю, что это работает даже в C # ... вам нужен указатель, который будет инициализирован в операторе switch:

Hero* _hero = 0;

switch(hClass){
  case 1: _hero = new Wizard;
  break;
}

// use _hero ...

// at the end, delete it
delete _hero;

Впрочем, теперь вам, скорее всего, нужен виртуальный деструктор и виртуальные функции. Читайте о них, они мощная функция OO. Но вы, вероятно, знаете о них из C #.

0 голосов
/ 20 мая 2011

Объект _hero ограничен областью действия этого блока switch.То, что вы хотите, вероятно, это:

Hero* _hero;

switch (hClass) {
case 1:
    _hero = new Wizard();
    break;
}

cout << _hero->GetName();
...