Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;类:带有标识符的错误 我在C++中有一个2个类的项目。_C++_Class - Fatal编程技术网

C++;类:带有标识符的错误 我在C++中有一个2个类的项目。

C++;类:带有标识符的错误 我在C++中有一个2个类的项目。,c++,class,C++,Class,MAIN.CPP: #include <iostream> #include <conio.h> #include "Player.h" #include "Enemy.h" using namespace std; int main() { const int startHealth = 100, startArmor = 50, startEnemyHealth = 70, startWeapon = 1; Player *Mick = new Player(s

MAIN.CPP:

#include <iostream>
#include <conio.h>
#include "Player.h"
#include "Enemy.h"

using namespace std;

int main()
{
const int startHealth = 100, startArmor = 50, startEnemyHealth = 70, startWeapon = 1;

Player *Mick = new Player(startHealth, startArmor, startWeapon);
Enemy *Mon = new Enemy(startEnemyHealth);

cout << "START!" << endl;
cout << Mick->Health << " : " << Mick->Armor << endl;

cout << "ENEMY ATTACKS!" << endl;
Mon->Attack(Mick);

cout << "DAMAGE TAKEN!" << endl;
cout << Mick->Health << " : " << Mick->Armor << endl;

cout << "YOU ATTACK!" << endl;
Mick->Attack(Mon);

cout << "ENEMY'S HEALTH!" << endl;
cout << Mon->Health << endl;

_getch();
return 0;
} 
敌人.H

#pragma once
#include "Enemy.h"

class Player
{
public:
int Health, Armor;
int Weapon;

public:
Player(const int _startHealth, const int _startArmor, const int         _startWeapon);
~Player();
void Attack(Enemy *_attackedEnemy);
};
#pragma once
#include "Player.h"

class Enemy
{
public:
float Speed;
int Damage;
int Health;

public:
Enemy(const int _startEnemyHealth);
~Enemy();
void Attack(Player *_attackedPlayer);
void Refresh(Enemy *_enemyToRefresh);
};
我得到的错误如下:

同时,这些是代码块给我的错误:


有人能帮我解决这个问题吗?

问题是你的
玩家
职业是指你的
敌人
职业,也指你的
玩家
职业:

class Enemy
{
    void Attack(Player *_attackedPlayer);
}
class Player
{
    void Attack(Enemy *_attackedEnemy);
}
class Player;
您需要的是转发声明,通知编译器某个特定类存在,而不告诉它任何有关该类的信息

在这里,您可以在文件
敌方.h
中,在
敌方
类的定义之前添加以下行:

class Enemy
{
    void Attack(Player *_attackedPlayer);
}
class Player
{
    void Attack(Enemy *_attackedEnemy);
}
class Player;
查看以了解如何处理转发声明

为什么在这里需要它,即使有相关的
#include
指令
#include
指令基本上是预处理器的指令,它告诉预处理器用包含的文件替换该指令。
#pragma once
指令确保每个翻译单元不会多次包含该文件

在Main.cpp中,发生了以下情况:

  • #包含“Player.h”
    :包含文件
    Player.h
  • Player.h
    的第一行是
    #包含“敌方.h”
    :包含文件
    敌方.h
  • 敌方.h的第一行是
    #include“Player.h”
    :由于文件
    Player.h
    已经包含在内,因此该指令被忽略
  • 敌人的定义
  • 播放器的定义
  • 主功能的定义

如您所见,即使使用include,在定义类
敌人
时,编译器也不知道类
播放器
是否存在。这就是为什么您在此处绝对需要转发声明的原因。

您必须在player.h和敌军.h中转发声明类,因为两者都包含对方,但它们无法找到完整的类定义。可能是重复的谢谢,真的。非常感谢!!但是,我可以问你为什么需要向前声明吗?即使我在两个类中都包含了.h?我有一个问题,类名的第一个字母是否应该大写?或者它不再重要了?(用php)Tnx@stack在C++中,用大写字母来启动类/结构/枚举名称是常见的做法,但没有什么可以强迫你。只要您的命名约定在一个项目中是一致的,就可以了。