Реализуйте функции из других файлов классов C ++

0

Поэтому я немного знаком с C++, и наш учитель не дошел до того, чтобы рассказать нам, как использовать функции из отдельных файлов классов.

Сейчас мы просто делаем текстовые материалы, но у меня есть это, где он случайно выбирает тип врага и врага из массивов. Это функция, которая в отдельном файле класса "enemy.cpp"

В "main.cpp" я хочу вызвать эту функцию. (Я думал, что это будет что-то вроде "enemy.genRandEnemy()", но это не работает).

Здесь код для класса противника -

#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <stdlib.h>

using namespace std;
using std::cout;
using std::cin;
using std::endl;
using std::string;

class enemy{
    public:
        void genRandEnemy();
};

void genRandEnemy() {

    string enemy[] = {"dragon", "troll", "wolf", "wraith", "spider", "scorpion", "hydra", "snake", "reaper", "centipede", "worm"};
    string enemyType[] = {"hell", "ice", "soul eater", "bone", "carnivorous"};

    srand(time(0)); 
    int randomEnemy = rand();
    int randomEnemyType = rand();

    int randEnemy = (randomEnemy % 11);
    int randEnemyType = (randomEnemyType % 5);

    if(randEnemyType == 0){cout << enemyType[0];} 
    else if(randEnemyType == 1){cout << enemyType[1];} 
    else if(randEnemyType == 2){cout << enemyType[2];}
    else if(randEnemyType == 3){cout << enemyType[3];}
    else if(randEnemyType == 4){cout << enemyType[4];}

    cout << " ";

    if(randEnemy == 0){cout << enemy[0];}
    if(randEnemy == 1){cout << enemy[1];}
    if(randEnemy == 2){cout << enemy[2];}
    if(randEnemy == 3){cout << enemy[3];}
    if(randEnemy == 4){cout << enemy[4];}
    if(randEnemy == 5){cout << enemy[5];}
    if(randEnemy == 6){cout << enemy[6];}
    if(randEnemy == 7){cout << enemy[7];}
    if(randEnemy == 8){cout << enemy[8];}
    if(randEnemy == 9){cout << enemy[9];}
    if(randEnemy == 10){cout << enemy[10];}
}

и здесь код snip из основного класса -

cout << "Then out comes three " << enemy.genRandEnemy() << "s and they encircle you. ";

Также в основном классе, у меня есть, где включены - #include "enemy.cpp"

Я не думаю, что у меня есть вражеский класс, настроенный для этого, и я не уверен, как это сделать.

  • 2
    В C ++ нет файлов классов. void genRandEnemy() определяет глобальную функцию, вы, вероятно, хотели определить void enemy::genRandEnemy() .
  • 0
    о ... ну, я сделал это, и все еще не работал .. в журнале ошибок было сказано - [Ошибка] ожидаемое первичное выражение перед '.' токен - это "." именно там, где "врага.генRandEnemy ()"
Показать ещё 1 комментарий
Теги:
class
function

2 ответа

1
Лучший ответ

Ваше расщепление кода на несколько файлов является неудачным. Вы должны поместить объявление типов и функций, которые вы хотите использовать в нескольких файлах в файл заголовка. Поэтому создайте файл enemy.hpp и вставьте в него объявление enemy:

class enemy
{
public:
  void genRandEnemy();
};

Поместите определение функций в отдельный исходный файл и назовите его enemy.cpp. Это будет выглядеть так:

#include "enemy.hpp"
#include <iostream>
// All your other includes needed to define the function...

void
enemy::genRandEnemy()
{
  // Implementation of the function...
}

Затем в любом файле, который нужно вызвать enemy::genRandEnemy:

#include "enemy.hpp"

void
f()
{
  enemy foe;
  foe.genRandEnemy();
  // Or whatever...
}

Обратите внимание, что ваш код несовместим: вы объявляете genRandEnemy как функцию-член класса enemy класса, но определяете его как свободную функцию вне любого класса. Мой пример всегда ставит его как члена enemy. (Это действительно кажется мне привязанным. Функция с этим именем должна была бы создать нового врага и вернуть его. Если это член enemy, мне понадобится enemy раньше времени, чтобы создать его.)

Два других замечания:

  • Каждый раз, когда genRandEnemy функция genRandEnemy вы повторно genRandEnemy случайный генератор. Это приведет к плохой случайности.
  • Я уверен, что вы можете найти лучшее решение, чем куча if(randEnemy == 1) { cout << enemy[1]; } if(randEnemy == 1) { cout << enemy[1]; }. Ты можешь?
  • 0
    да, я знаю, что использовать случайные вещи, которые у меня есть сейчас, нехорошо, но сейчас это придется делать, пока я не углублюсь в эту книгу по C ++ в своем классе. И да, я использовал код нижеприведенного человека для сжатия 'if (randEnemy == 1) {cout << врага [1];}', я просто использовал это для температуры, так как мне не хотелось выяснять, как сжать его в данный момент.
0

Это ваш класс:

class Enemy{ //I change it to not confuse with the local variable in genRandEnemy.
    public:
        void genRandEnemy(); //you should return a string instead of the printing
};

прототип функции:

void Enemy::genRandEnemy() {
...
}

и вы используете его вот так:

int main()
{
   Enemy e;//declare a variable
   //now you use the variable:
   cout << "Then out comes three ";
   e.genRandEnemy();
   cout << "s and they encircle you. ";
   return 0;
}

КСТАТИ:

вы можете сократить свой код:

 if(randEnemyType == 0){cout << enemyType[0];} 
 else if(randEnemyType == 1){cout << enemyType[1];} 
 else if(randEnemyType == 2){cout << enemyType[2];}
 else if(randEnemyType == 3){cout << enemyType[3];}
 else if(randEnemyType == 4){cout << enemyType[4];}

могут быть заменены на:

 cout<<enemyType[randEnemyType];     

И то же самое:

 if(randEnemy == 0){cout << enemy[0];}
 if(randEnemy == 1){cout << enemy[1];}
 if(randEnemy == 2){cout << enemy[2];}
 if(randEnemy == 3){cout << enemy[3];}
 if(randEnemy == 4){cout << enemy[4];}
 if(randEnemy == 5){cout << enemy[5];}
 if(randEnemy == 6){cout << enemy[6];}
 if(randEnemy == 7){cout << enemy[7];}
 if(randEnemy == 8){cout << enemy[8];}
 if(randEnemy == 9){cout << enemy[9];}
 if(randEnemy == 10){cout << enemy[10];}

могут быть заменены на:

 cout << enemy[randEnemy];
  • 0
    «и вы используете это так» - вероятно, нет, если это void функция.
  • 0
    @ Оберон Вы правы, я исправил это, в исходном коде много ошибок.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню