错误预期在';'之前的primary-expression代币

时间:2013-12-06 11:33:50

标签: c++

您好我的代码有问题

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令牌

感谢您的帮助

4 个答案:

答案 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不是合法的符号,这会触发错误。