Я работаю над игрой, в которой в настоящее время пытаюсь создать структуру игрока для хранения информации об игроке, например имени. Я хотел бы сделать класс для разделения сегментов кода для более чистого кода в моем main.cpp.

У меня есть моя структура:

   //in main.cpp
 #include "player.h"
class MyClass player
    struct _Player {
        std::string name;
        int hp;
        int mana;
        int def;
        int mana_regen;
        int hp_regen;
    } player1;

void playerinfo2(_Player *playerx) {
    playerx->name = "test2";
}

int main() {
    player1.name = "test1";
    std::cout << player1.name << std::endl;
    playerinfo2(&player1);
    std::cout << player1.name;
    player.playerinfo(&player1);
}

Этот код работает и меняет имя player1 с «test1» на «test2».

//in player.h   
class MyClass {

struct _Player {
    std::string name;
    int hp;
    int mana;
    int def;
    int mana_regen;
    int hp_regen;
};
public:

void player_update();
void playerinfo(_Player *self);

private:

};

Я не знаю, должна ли структура существовать как в заголовке, так и в файле .cpp, но она говорит «неизвестный _Player», если я не делаю.

//in player.cpp
#include "player.h"

struct _Player {
    std::string name;
    int hp;
    int mana;
    int def;
    int mana_regen;
    int hp_regen;
};

void Player::player_update() {
    playery.mana = playery.mana + playery.mana_regen;

}

void Player::playerinfo(_Player *self) {
    self->name = "test3";
}

При запуске в консоли g ++ main.cpp player.cpp -o test.exe я получаю сообщение об ошибке:

main.cpp: In function 'int main()':
main.cpp:29:29: error: no matching function for call to 'Player::playerinfo(_Player*)'
     test.playerinfo(&player1);
                             ^
In file included from main.cpp:4:0:
player.h:21:6: note: candidate: void Player::playerinfo(Player::_Player*)
 void playerinfo(_Player *self);
      ^~~~~~~~~~
player.h:21:6: note:   no known conversion for argument 1 from '_Player*' to 'Player::_Player*'

Есть ли способ передать мой player1 классу, как я делаю с моей функцией в main.cpp?

c++
0
darclander 18 Апр 2019 в 17:12

2 ответа

Лучший ответ

Я решил проблему, переименовав мой класс в неиспользуемое имя, поместил структуру только в player.h, объявил player1 в main.cpp, а затем отправил player1, как я сделал, чтобы отправить его в функцию playerinfo2.

//in main.cpp
#include "player.h"

class MyClass test;


userPlayer player1;

void playerinfo2(userPlayer *self) {
    self->name = "test1";
}

int main() {
    playerinfo2(&player1);
    std::cout << player1.name;
    test.playerinfo(&player1);
    std::cout << player1.name;

}


//in player.h
#include <string>
#include <iostream>

struct userPlayer {
    std::string name;
    int hp;
    int mana;
    int def;
    int mana_regen;
    int hp_regen;
};

class MyClass {

public:

void player_update();
void playerinfo(userPlayer *self);

private:

};

//in player.cpp
#include "player.h"


void MyClass::playerinfo(userPlayer *self) {
    self->name = "test3";
}

Этот обновленный код работает для меня.

0
darclander 18 Апр 2019 в 14:45

Нет, вам нужно определить класс только один раз в заголовочном файле (скажем, player.h) и использовать #include player.h во всех файлах класса. Если у вас есть какая-либо функция для класса проигрывателя, это соглашение, вы объявляете их в заголовочном файле и определяете их в файле .cpp. Вы также можете объявить и определить их в заголовочном файле и избежать файла .cpp, но это может привести к запутанному коду.

1
Suven Pandey 18 Апр 2019 в 14:21