构造函数c ++的问题

时间:2008-12-16 21:07:25

标签: c++

所以我为Weapon类的这些构造函数提供了这个代码:

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\weapon.h(21) : error C2059: syntax error : '('
1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(21) : error C2238: unexpected token(s) preceding ';'
1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(33) : error C2327: '<unnamed-tag>::maxWeapons' : is not a type name, static, or enumerator
1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(33) : error C2065: 'maxWeapons' : undeclared identifier
1>c:\users\owner\desktop\bosconian\code\bosconian\weapon.h(38) : warning C4094: untagged 'class' declared no symbols

我是一个半新手,我无法弄明白。

第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:
.....

8 个答案:

答案 0 :(得分:19)

#ifndef Weapon
#define Weapon

这几乎肯定会导致奇怪;改为调用常量WEAPON_H。

答案 1 :(得分:7)

所以你将你的类命名为预处理器指令?这是我要避免的事情。

尝试更改预处理器武器或制作不同的类名。我认为它会更好。

答案 2 :(得分:5)

我认为问题出现在#define Weapon中 - 代码中稍后出现的“武器”将被删除或替换为你不想要的东西。

答案 3 :(得分:4)

解释蒂姆的回答。你看到这样的代码:

#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);
}

但是您已将预处理器宏Weapon定义为空字符串,因此编译器会看到:

#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);
}

只需更改包含保护以使用不作为名称出现的字符串(例如WEAPON_H_INCLUDED)。

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

我不知道这是否是微软特有的(我最近才使用过VS2005),但是这样可行。我使用以下命令启动所有头文件:

#pragma once

答案 6 :(得分:0)

GCC还支持“#pragma once”,但它不是标准的,如果你使用传统的包含守卫#ifndef _MYFILE_H_或某些变体,代码将更具可移植性。

答案 7 :(得分:-1)

快速说明:在C ++中,与C不同,当函数(或析构函数,在本例中)没有任何参数时,您不需要使用(void),只需使用()。 / p>