C++ 构造函数c+出现问题+;

C++ 构造函数c+出现问题+;,c++,C++,所以我有这些武器类构造函数的代码: Weapon(const WeaponsDB * wepDB); Weapon(const WeaponsDB * wepDB_, int * weaponlist); ~Weapon(void); 我不断地得到一个错误: 1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(20) : error C2062: type 'int' unexpected 以及随后出现的错误(不止列

所以我有这些武器类构造函数的代码:

Weapon(const WeaponsDB * wepDB);
Weapon(const WeaponsDB * wepDB_, int * weaponlist);
~Weapon(void);  
我不断地得到一个错误:

1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(20) : error C2062: type 'int' unexpected
以及随后出现的错误(不止列出):

1>c:\users\owner\desktop\bosconian\code\bosconian\nearm.h(21):错误C2059:语法错误:'('
1> c:\users\owner\desktop\bosconian\code\bosconian\nearm.h(21):错误C2238:在“;”之前的意外令牌
1> c:\users\owner\desktop\bosconian\code\bosconian\Bearm.h(33):错误C2327:“::MaxBearms”:不是类型名、静态或枚举数
1> c:\users\owner\desktop\bosconian\code\bosconian\Wearm.h(33):错误C2065:“MaxWearms”:未声明的标识符
1> c:\users\owner\desktop\bosconian\code\bosconian\nearm.h(38):警告C4094:未标记的“类”未声明任何符号
我是个半新手,还没弄明白

第21行是第二个构造函数,第一个构造函数不会导致错误。 另外,如果我注释掉这个构造函数,我仍然会得到在该构造函数之后列出的所有错误。你知道问题是什么吗

以上代码仅供参考:

#ifndef Weapon
#define Weapon
#include <allegro.h>
#include <stdio.h>
#include <iostream>

using namespace std;

class WeaponsDB;
class MenuDriver;
class Ammo;

class Weapon
{
public:
.....
\ifndef武器
#定义武器
#包括
#包括
#包括
使用名称空间std;
类武器;
MenuDriver类;
类弹药;
阶级武器
{
公众:
.....

那么您将类命名为与预处理器指令相同的类?这是我要避免的

试着改变你的预处理器武器或者换一个不同的类名。我认为这样会更好

#ifndef Weapon
#define Weapon

这几乎肯定会引起奇怪;取而代之的是常量武器。

我认为问题在于定义武器-代码中稍后出现的任何“武器”都将被删除或替换为您不打算使用的东西。

来解释Tim的答案。您看到的代码如下:

#ifndef Weapon
#define Weapon
#include <allegro.h>
#include <stdio.h>
#include <iostream>

using namespace std;

class WeaponsDB;
class MenuDriver;
class Ammo;

class Weapon
{
public:
   Weapon(const WeaponsDB * wepDB);
   Weapon(const WeaponsDB * wepDB_, int * weaponlist);
   ~Weapon(void);
}

只需将include-guard更改为使用一个不作为名称出现的字符串(例如,
wearm\u H\u include
)。

我不知道这是否是特定于Microsoft的(我最近才使用VS2005),但这是有效的。我使用以下命令启动所有头文件:

#pragma once

还支持“γ-语用”,但如果使用传统的包含守护程序的IFNDEF、MyFieleHHI或某些变体,代码将更便携。

< P>只是一个快速注释:在C++中,与C不同,当函数(或析构函数,在这种情况下)没有任何参数时,不需要使用(空格),只需使用().

像其他已经提供的答案一样,我也怀疑预处理器指令


要确认,比如在GCC上,您可以请求它只运行预处理器并将输出保存在某个地方。您使用的编译器可能有类似的功能。

包含“public:”的行之间是否有任何内容你在这个问题中显示的第一个构造函数?MH,我不能把行号与你的代码匹配。你介意把完整的错误记录下来吗?当你删除一些包含的时会发生什么?@ Paul Betts:我在你的答案中把武器变成了武器。“ead,因为它可能更快,而且读起来更干净。@麦肯尼,我觉得“ifndef/#define/#endif”这个东西现在已经变成了一个习语,所以这其实不是一个更容易阅读的问题。我会斜视任何没有它的标题,因为它变得如此普遍。@麦肯尼:赫伯·萨特和安德烈·亚历山德雷斯库写道在他们的书中,“大多数编译器”现在认识到了宏保护,并提供了与使用#pragma onset back(和摆脱多年习惯)相同的性能优势我认为在文件顶部用一行pragma比在一堆预处理器样板文件中用括号括住整个头更干净。我过去搞砸了旧式的做事方式(错误的符号复制粘贴到新的hdr)但是,预处理器不会咀嚼武器数据库条目,因为它是用整词来表示的。否则,如果有人定义C,他们将陷入一个充满冲突的世界。你可以在gcc中使用
-E
开关:gcc-E>输出来实现这一点
#ifndef Weapon
#define Weapon
#include <allegro.h>
#include <stdio.h>
#include <iostream>

using namespace std;

class sDB;
class MenuDriver;
class Ammo;

class 
{
public:
   (const sDB * wepDB);
   (const sDB * wepDB_, int * weaponlist);
   ~(void);
}
#pragma once