Почему Wizard wiz0; не эквивалентен Wizard wiz0 (); в моем коде? Ошибка C2228

Возможный дубликат:
Разве скобки на конструкторе без аргументов не являются стандартом языка?

Хорошо, у меня есть соленье. Это ошибка C2228, и я посмотрел на другие вопросы и ответы, и ни один из приведенных советов, похоже, не работает для меня — это мой первый вопрос, и я новичок, поэтому, пожалуйста, будьте осторожны! Примечание: программа скомпилируется, если я использую

Wizard wiz0;

но НЕ, если я использую

Wizard wiz0();

Книга, которую я использую, говорит мне, что эти два утверждения должны быть эквивалентны, поэтому я пытаюсь понять, почему я могу использовать одно, а не другое.

Прежде всего, вот ошибка, когда я пытаюсь использовать Wizard wiz0 ():

1>  Chapter5.cpp
1>Chapter5.cpp(14): error C2228: left of '.fight' must have class/struct/union
1>Chapter5.cpp(15): error C2228: left of '.talk' must have class/struct/union
1>Chapter5.cpp(17): error C2228: left of '.setArmor' must have class/struct/union
1>Chapter5.cpp(19): error C2228: left of '.getName' must have class/struct/union
1>Chapter5.cpp(21): error C2228: left of '.castSpell' must have class/struct/union

Вот (что я думаю) соответствующий код из Chapter5.cpp:

Wizard wiz0(); //declares a variable (wiz0) of type Wizard.

wiz0.fight();
wiz0.talk();

wiz0.setArmor(10);

cout << "Player's Name: " << wiz0.getName() << endl;

wiz0.castSpell();

Кроме того, вот информация из файла wiz.h:

public
//Constructor
Wizard();

//Overloaded Constructor
Wizard(std::string name, int hp, int mp, int armor);

//Destructor
~Wizard();

//Methods
void fight();
void talk();
void castSpell();
void setArmor(int mArmor);
std::string Wizard::getName();

private:
//Data members
std::string mName;
int mHitPoints;
int mMagicPoints;
int mArmor;

…и, наконец, информация из файла wiz.cpp!

//Wiz.cpp implementation file

#include "stdAfx.h"#include "wiz.h"using namespace std;

//The Constructor call
Wizard::Wizard()
{
/*If the client calls a constructor without
specifying values, these will be the default
values that the program will use */
mName = "DefaultName";
mHitPoints = 1;
mMagicPoints = 1;
mArmor = 0;
}

Wizard::Wizard(std::string name, int hp, int mp, int armor)
{
//Client called constructor WITH values, so create an
//object with them.
mName = name;
mHitPoints = hp;
mMagicPoints = mp;
mArmor = armor;
}

void Wizard::fight()
{
cout << "Fighting." << endl;
}

void Wizard::talk()
{
cout << "Talking." << endl;
}

void Wizard::castSpell()
{
if (mMagicPoints < 4)
cout << "Casting spell." << endl;
else
cout << "Not enough MP!" << endl;
}

void Wizard::setArmor(int armor)
{
if(armor >= 0)
mArmor = armor;
}

std::string Wizard::getName()
{
return mName;
}

Wizard::~Wizard()
{
//Not using dynamic memory- nothing to clean
}

Фу … Я думаю это все. Если вы, ребята, сможете понять, что я делаю неправильно, я был бы очень признателен!

3

Решение

Это странная часть анализа C ++. Тот, что в скобках, интерпретируется как прототип функции. Вы должны использовать тот, без скобок.

3

Другие решения

Wizard wiz0;

создает экземпляр Wizard объект называется wiz0

Wizard wiz0();

объявляет функцию wiz0 возвращая Wizard по значению. Это упрощенная версия самый неприятный разбор.

6

По вопросам рекламы [email protected]