尝试将Struct指针传递给类[C ++]时出错

时间:2019-04-18 14:12:24

标签: c++

我正在开发一个游戏,目前我正在尝试制作一个播放器结构以存储播放器信息(例如名称)。我想创建一个类来划分代码段,以使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传递给类吗?

2 个答案:

答案 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";
}

此更新的代码对我有用。