我正在开发一个游戏,目前我正在尝试制作一个播放器结构以存储播放器信息(例如名称)。我想创建一个类来划分代码段,以使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文件中,但是如果没有,它会显示“ unknown _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播放器.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*'
有什么办法可以像在main.cpp中使用函数那样将player1传递给类吗?
答案 0 :(得分:1)
否,您仅需要在头文件(例如player.h)中定义一次类,并在所有属于类的文件中使用#include player.h
。如果您有任何用于播放器类的功能,则按照惯例,可以在头文件中声明它们,并在.cpp
文件中定义它们。您还可以在头文件中声明和定义它们,并避免使用.cpp
文件,但这会导致代码混乱。
答案 1 :(得分:0)
我通过将类重命名为未使用的名称解决了该问题,仅将结构放在player.h中,在main.cpp中声明了player1,然后像我将其发送到playerinfo2函数一样发送了player1。
//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";
}
此更新的代码对我有用。