Поэтому я немного знаком с 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"
Я не думаю, что у меня есть вражеский класс, настроенный для этого, и я не уверен, как это сделать.
Ваше расщепление кода на несколько файлов является неудачным. Вы должны поместить объявление типов и функций, которые вы хотите использовать в нескольких файлах в файл заголовка. Поэтому создайте файл 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]; }
. Ты можешь?Это ваш класс:
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];
void
функция.
void genRandEnemy()
определяет глобальную функцию, вы, вероятно, хотели определитьvoid enemy::genRandEnemy()
.