gpt4 book ai didi

c++对象未跨文件注册

转载 作者:行者123 更新时间:2023-11-27 23:04:06 25 4
gpt4 key购买 nike

所以我是编程新手,基本上我所知道的一切都是通过数小时和数小时的愚蠢错误和对相同错误的认识自学成才,但这简直要了我的命。每当我尝试编译时,我都会得到以下信息:

“'.'之前的预期主表达式 token ”

问题可能出在这里,因为我喜欢让我的东西保持整洁,因此将它们分成多个文件,并且沿着这些线的某个地方我的对象丢失了,或者什么的。以下是错误的地方:

main.cpp

  void start()
{
Player Player; //Making the object Player, it works for the main file, but Combat.h
int num, x, j=0; //doesn't really like it for whatever reason.
int stats[] = {2,3,4,5,4,1,8,5,8,7,6,5};
int realstats[]={};
string classes[] = {"Warrior", "Mage", "Priest", "Rogue", "Hunter", "Druid"},name;
cin>>name; //Charr's name
cin>>num; //class number for stat-sorting purpouses
for(x=num*4,j;x<num*4+4;++x,++j)
{
realstats[j]=stats[x];
}
Player.def=realstats[0];
Player.str=realstats[1];
Player.agi=realstats[2];
Player.intel=realstats[3];
}

玩家敌人.h

  #include"MainHeader.h"
#ifndef PlayerEnemy_H
#define PlayerEnemy_H
class Player
{
public:
float att,def,str,agi,intel,HP,XP,sp,money;
float setstat(float str,float def,float agi,float HP,float att,float sp);
};


class Enemy
{
public:
float att,def,str,agi,intel,HP,XP,sp,money;
float setstat(float str,float def,float agi,float HP,float att,float sp);
};
#endif

战斗.h

#include"MainHeader.h"
#ifndef Combat_H
#define Combat_H
void Combat(int x)
{
int GG();
int y=1;
system("pause");
while(monster[x].HP>0 && Player.HP>0)
{
if(monster[x].sp>Player.sp&&y==1)
{
Player.HP-=(monster[x].att-Player.def);
x=0;
}
if(Player.HP>0&&monster[x].HP>0) monster[x].HP-=(Player.att-monster[x].def);
if(Player.HP>0&&monster[x].HP>0) Player.HP-=(monster[x].att-Player.def);
}
if(monster[x].HP<=0)
{
Player.money+=monster[x].money;
Player.XP+=monster[x].XP;
}
else GG();
}
#endif

“MainHeader.h”东西只是我制作的包含其他标题的标题,因为我不希望前 20 行只是#include。

无论如何,如果我在 Combat.h 中的 Player 类中重新制作另一个名为 Player 的对象,一切正常,但它们没有相同的值,如果我删除第一个,其余代码就会变得糟糕。据我所知,它应该告诉我 Player 已经声明,所以我不知道哪里出错了。

这里是 MainHeader.h,以防万一我遗漏了一些东西......不过别这么想。但话又说回来,是我的代码不起作用。

#ifndef MainHeared_H
#define MainHeared_H

#include"PlayerEnemy.h"
#include"EnemyType.h"
#include"Combat.h"

#endif

最佳答案

任何源文件中的代码只能“看到”到目前为止该文件中的其他内容,以及任何包含的头文件。不进入其他 cpp 文件。

您有一个在 header 中定义的类名 Player,并且可以从Combat 函数中看到。然而,变量声明

Player Player;  

仅在其声明范围内可见,即 start() 函数。其他函数看不到这个变量,更不用说其他文件了。

CombatPlayer.ID时,编译器只知道Player是类名,并不知道将 . 放在类名之后是有意义的。


要解决此问题,首先要做的是停止对类使用与变量相同的名称。这是非常困惑的。例如写:

Player my_player;

要做的第二件事是不要将函数代码放在标题中。如果您在整个项目中多次包含 header ,则会导致未定义的行为。 Combat() 的主体应该在 .cpp 文件中。您可以在 header 中放置一个函数声明,仅此而已:

void Combat(int x);

如果你想拥有一个对所有代码可见的 Player 实例,那么你必须在头文件中编写:

extern Player global_player;

然后在 一个 .cpp 文件中,在任何函数体之外:

Player global_player;

关于c++对象未跨文件注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24792944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com