您好我的代码有问题
的 Armor.h 的
#ifdenf armor
#define armor
class Armor {
private:
int m_weight;
public:
Armor(int weight);
};
#endif
的 Knight.h 的
#ifndef knight
#define knight
#include "Armor.h"
class Knight {
private:
Armor* m_armor;
string m_name;
int m_strength;
public:
Knight(string name, int strength);
void setArmor(Armor* armor);
};
#endif
的 Knight.cpp 的
#include "Knight.h"
void Knight::setArmor(Armor* armor){
m_armor = armor; // error occurred
}
错误:错误:在';'之前预期的primary-expression令牌
感谢您的帮助
答案 0 :(得分:4)
#define armor
现在,您无法在包含此标头的任何源文件中使用名称armor
。预处理器将删除它。
m_armor = armor; // error occurred
糟糕!预处理器将其转换为
m_armor = ;
我建议使用ALL_CAPS
的约定来表示宏,而不是其他任何东西,这样它们就不会踩踏常规代码。你也可以考虑#pragma once
而不是基于宏的包含守卫,尽管不能保证它是可移植的。
答案 1 :(得分:3)
不要忘记用分号关闭Knight
班级声明!
(出于兴趣,这在C ++中是必需的,而不是在Java中)。
答案 2 :(得分:3)
你需要包括警卫。
修改强>
假设对问题的编辑,包括警卫实际使用armor
如下,
#ifdenf armor //<<--- ARE YOU POSTING THE ACTUAL CODE... try #ifndef
#define armor
//...
#endif
然后尝试使用armor
作为变量名称。尝试
#ifndef ARMOR_INCLUDED
#define ARMOR_INCLUDED
//...
#endif
代替
结束修改
此外,类Knight
需要一个尾随分号。
class Knight {
private:
Armor* m_armor;
string m_name;
int m_strength;
public:
Knight(string name, int strength);
void setArmor(Armor* armor);
}; //<----------
作为一般规则,如果您在一行上看到关于语法的编译错误(看起来没问题),请向后工作以查看之前的某些内容是否导致它。
答案 3 :(得分:2)
在Knight.h
中,类定义缺少;
:
class Knight {
...
};
如果没有;
,则以下标记被解释为符号。在您的代码(Knight.cpp
)中,紧跟在include指令之后的代码。 void
不是合法的符号,这会触发错误。