c++对象未在文件之间注册

c++ Object not registered across files

本文关键字:之间 注册 文件 对象 c++      更新时间:2023-10-16

所以我是编程新手,基本上我所知道的一切都是自学成才的,经历了一个又一个小时的愚蠢错误和同样的实现,但这简直要了我的命。每当我尝试编译时,我都会得到以下结果:

"应在'.'标记之前使用主表达式">

问题可能是存在的,因为我喜欢保持我的东西整洁,因此把它分成多个文件,在这一行的某个地方,我的对象会丢失,或者其他什么。以下是错误的位置:

主要.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];
  }

PlayerEnemy.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

Combat.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。

无论如何,如果我在战斗.h中从类Player中重新创建另一个名为Player的对象,所有对象都可以,但它们的值不相同,如果我删除了第一个,代码的其余部分就会下地狱。据我所知,它应该告诉我球员已经被宣布,所以我不知道我哪里出了问题。

这是MainHeader.h,以防我遗漏了什么。。。不过别这么认为。但话说回来,是我的代码不起作用。

#ifndef MainHeared_H
#define MainHeared_H
#include"PlayerEnemy.h"
#include"EnemyType.h"
#include"Combat.h"
#endif

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

您有一个类名Player,它在标头中定义,并且可以从Combat函数中看到。但是变量声明

Player Player;  

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

Combat编写类似Player.ID的内容时,编译器只知道Player是类名,而将.放在类名之后是没有意义的。


要解决这个问题,首先要做的是停止将类的名称用作变量。这很令人困惑。例如,写入:

Player my_player;

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

void Combat(int x);

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

extern Player global_player;

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

Player global_player;
    Player Player;  // this is wrong
Player player  // this is OK

您不应该使用类型名称作为标识符。

Player.def=realstats[0];  // "expected primary-expression before '.' token"

你指的是对象还是类??