2012-05-23 4 views
-5
class fairy 
    { 
    protected: 
     bool x; 
     int points; 
    public: 
     fairy(); 
     void intro(string, int); 
     void call_decision(int, int); 
    }; 

    fairy::fairy() 
    { 
     x = true; 
     points = 0; 
    } 

    void fairy::intro(string NAME, int case_type) 
    { 
     int decision = 0; 
     cout << "Hello, my name is" << NAME << "." << endl << "What would you like to do" << endl; 
     while(x) 
     { 
     cout << endl; 
     cout << "(1) Ask for a wish." << endl; 
     cout << "(2) Offer to help the fairy." << endl; 
     cout << "(3) Say goodbye to the fairy." << endl; 
     cin >> decision; 
     call_decision(decision, case_type); 
     } 
    } 

    class good : fairy 
    { 
    protected: 
     int wish_num; 
     bool HELP; 
    public:a 
     good(); 
     static string name; 
     void wish(); 
     void help(); 
    }; 

    good::good() 
    { 
     name = "Sandy"; 
     wish_num = 0; 
     HELP = true; 
    } 

    void good::wish() 
    { 
     if (wish_num != 5) 
     { 
     cout << "Your wish has been granted" << endl; 
     points += 10; 
     wish_num++; 
     } 
     else 
     { 
      cout << "Sorry, I can not grant you another wish" << endl; 
     } 
    } 

    void good::help() 
    { 
     if (HELP) 
     { 
      cout << "THANK YOU" << endl; 
      points += 50; 
      HELP = false; 
     } 
     else 
     { 
      cout << "Thank you but I don't need anymore help." << endl; 
     } 
    } 

    class evil : fairy 
    { 
    protected: 

    public: 
     evil(); 
     static string name; 
     void wish(); 
     void help(); 
    }; 

    evil::evil() 
    { 
     name = "Seth"; 
    } 

    void evil::wish() 
    { 
     cout << "NO!!!! MUHHHHHAAAA!!!" << endl; 
     points -= 10; 
    } 

    void evil::help() 
    { 
      cout << "Thanks... NOT, I don't even want your help!!" << endl; 
      points -= 50; 
    } 

    class equivocal : fairy 
    { 
    protected: 
     int wish_num; 
    public: 
     equivocal(); 
     static string name; 
     void wish(); 
     void help(); 
    }; 

    equivocal::equivocal() 
    { 
     name = "Joe"; 
     wish_num = 0; 
    } 

    void equivocal::wish() 
    { 
     int random = (rand() % 2); 
     if (random && wish_num != 3) 
     { 
     cout << "Your wish has been granted" << endl; 
     points += 10; 
     wish_num++; 
     } 
     else 
     { 
      cout << "Sorry, I can not grant you another wish" << endl; 
      points -= 10; 
     } 
    } 

    void equivocal::help() 
    { 
     cout << "I'll think about it" << endl; 
    } 

    void fairy::call_decision(int decision, int case_type) 
    { 
    good one; 
    evil two; 
    equivocal three; 

     { 
     switch(decision) 
     { 
     case'1': 
      { 
       switch (case_type) 
        { 
         case '0': 
          one.wish(); 
         case '1': 
          two.wish(); 
         case '2': 
          three.wish(); 
        } 
      } 
     case '2': 
      { 
       switch (case_type) 
        { 
         case '0': 
          one.help(); 
         case '1': 
          two.help(); 
         case '2': 
          three.help(); 
        } 
      } 
     case '3': 
      { 
       x = false; 
      } 
     } 
     } 
    } 

int main() 
{ 
    fairy game; 
    good one; 
    evil two; 
    equivocal three; 
    string NAME; 
    int case_type = 0; 
    int num = rand(); 
    for (int i = 0; i < 3; i++) 
    { 
    switch (num % 3) 
     { 
      case '0': 
       NAME = one.name; 
       case_type = 0; 
      case '1': 
       NAME = two.name; 
       case_type = 1; 
      case '2': 
       NAME = three.name; 
       case_type = 2; 
      default: 
       case_type = -1; 
     } 

    game.intro(NAME, case_type); 
    num++; 
    } 


} 

Можно ли определить fairy::call_decision после всех производных классов? (Это позволило мне сделать ссылки в базовом классе производных классов.)Ошибки компоновщика C++ со статическими элементами

Если да, то почему я получаю ошибки lnk 2001 при попытке скомпилировать?

Если нет, то как я могу его скомпилировать с помощью void fairy::call_decision, определенного сразу после определения void fairy::intro?

+2

Пожалуйста, вставьте соответствующие части кода прямо в свой вопрос, не гиперссылка! Вы не можете ожидать, что люди последуют за ссылкой, а затем просеивают через 200 строк кода ... –

+1

_ "но я делаю это в любом случае, потому что есть много кода, и эта страница будет очень длинной." _ - Попробуйте публикации в форме [SSCCE] (http://sscce.org/), это может даже помочь вам обнаружить проблему самостоятельно. –

ответ

1

Большинство ошибок компиляции связаны с тем, что вы не включили файлы заголовков для типа string или cout. Поместите следующую строку в верхней части файла:

#include <iostream> 
#include <string> 
using namespace std; 
+0

Я бы рекомендовал квалифицировать объекты в пространстве имен 'std', а не' using namespace std; ', но это всего лишь мнение. –

+0

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

2

Причина у вас возникли проблемы, потому что вы std::string name s все объявленные static. Вы должны определить static членов вне вашего определения класса в области пространства имен, например: string good::name = "Sandy";

Смежные вопросы