Итак, у меня есть этот код для этих конструкторов класса оружия:
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:
.....
mh Я не могу сопоставить номера строк с номерами в вашем коде. И не могли бы вы опубликовать полные ошибки.
что происходит, когда вы удаляете некоторые из #includes?





Итак, вы назвали свой класс так же, как директива препроцессора? Этого я бы избегал.
Попробуйте сменить препроцессор Weapon или создать другое имя класса. Думаю, получится лучше.
#ifndef Weapon
#define Weapon
Это почти наверняка вызовет странности; вместо этого вызовите константу WEAPON_H.
@ Пол Беттс: Я изменил WEAPON_H в WEAPON_H в вашем ответе. См. stackoverflow.com/questions/228783/…
Если ваш компилятор поддерживает #pragma once, вы можете подумать об использовании этого вместо него, поскольку он потенциально быстрее и, безусловно, чище для чтения.
@mackenir, мне кажется, что # ifndef / # define / # endif к настоящему времени превратилось в идиому, так что на самом деле это не вопрос облегчения чтения. Я бы искоса посмотрел на любой заголовок, у которого его не было, потому что он стал настолько повсеместным.
@mackenir: Херб Саттер и Андрей Александреску в своих книгах пишут, что в настоящее время «большинство компиляторов» распознают защиту от макросов и предлагают такое же преимущество в производительности, как и использование #pragma once.
Отступая назад (и избавляясь от многолетних привычек), я думаю, что однострочный #pragma в верхней части файла чище, чем заключение в скобки всего заголовка в кучке шаблонов препроцессора. Я испортил старый способ делать что-то в прошлом (неправильный символ, скопированный и вставленный на новый hdr).
@dribeas: интересно. Тем не менее, это грязно и старомодно. Все просто согласны со мной. ;)
mackenir, я тоже с тобой не согласен. #pragma once не является стандартным, и его следует избегать, поскольку C++ обеспечивает то же самое в гарантированном рабочем режиме. и мне легче читать
Я думаю, что проблема в #define Weapon - любое появление «Weapon» позже в коде будет удалено или заменено чем-то, что вы не планировали.
Чтобы уточнить ответ Тима. Вы видите такой код:
#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).
Препроцессор не будет изменять записи WeaponsDB, так как он использует целые слова. В противном случае, если бы кто-то использовал #define C, он оказался бы в целом мире раздоров.
Я не знаю, относится ли это к Microsoft (недавно я использовал только VS2005), но это работает. Я начинаю все свои файлы заголовков с:
#pragma once
GCC также поддерживает "#pragma once", но это не стандартно, и код будет более переносимым, если вы будете использовать традиционный include guard #ifndef _MYFILE_H_ или какой-либо его вариант.
Небольшое примечание: в C++, в отличие от C, когда функция (или деструктор в данном случае) не имеет параметра, вам не нужно использовать (void), вы просто используете ().
Как и другие уже предоставленные ответы, я также подозреваю директиву препроцессора.
Для подтверждения, скажем, в GCC, вы можете запросить, чтобы он запускал только препроцессор и где-то сохранял этот вывод. Вероятно, есть аналогичные функции для используемого вами компилятора.
Вы можете сделать это в gcc с помощью переключателя -E: gcc <все переключатели, которые у вас есть в настоящее время> -E> output
есть ли что-нибудь между строкой, содержащей "public:", и первым конструктором, который вы указываете в вопросе?