【发布时间】:2015-02-06 23:55:21
【问题描述】:
所以我有这段代码,基本上应该创建对象,然后将它们发送到一个“竞技场”,该竞技场通过 cout 输出一串文本。我遇到的主要问题是当我尝试发送创建的对象时出现错误,我可以使用一些解释来了解我做错了什么/做错了什么。我(大部分)了解使用对象,但是当我开始使用 *.我遇到的问题是在 myGame.cpp 中的 Engine->arena 行。
代码:
引擎.h
#ifndef ENGINE_CLASS
#define ENGINE_CLASS
#include <string>
using namespace std;
class Engine
{
public:
Engine();
~Engine();
void arena(Character*, Character*);
};
class Character
{
private:
string m_name;
public:
Character();
~Character();
virtual void fight();
virtual string getName();
virtual void setName(string);
};
class Gladiator : public Character
{
public:
Gladiator();
~Gladiator();
virtual void fight();
virtual string getName();
virtual void setName(string);
};
class Monster : public Character
{
public:
Monster();
~Monster();
virtual void fight();
virtual string getName();
virtual void setName(string);
};
#endif
Engine.cpp
#include <iostream>
#include "Engine.h"
using namespace std;
//Methods for Engine Class
Engine::Engine()
{
}
Engine::~Engine()
{
}
void Engine::arena(Character *oCharacter1, Character *oCharacter2)
{
//Logic
oCharacter1->fight();
oCharacter2->fight();
//More Logic
}
//Methods for Parent-Charachter Class
Character::Character()
{
m_name = "Unknown";
}
Character::~Character()
{
m_name = "";
}
void Character::fight()
{
cout << "Fight" << endl;
}
string Character::getName()
{
return m_name;
}
void Character::setName(string newName)
{
m_name = newName;
}
//Methods for Child-Gladiator Class
Gladiator::Gladiator()
{
Character::setName("Maximus");
}
Gladiator::~Gladiator()
{
Character::setName("");
}
void Gladiator::fight()
{
cout << "Maximus strikes monster..." << endl;
}
string Gladiator::getName()
{
return Character::getName();
}
void Gladiator::setName(string newName)
{
Character::setName(newName);
}
//Methods for Child-Monster Class
Monster::Monster()
{
Character::setName("Monster");
}
Monster::~Monster()
{
Character::setName("");
}
void Monster::fight()
{
cout << "Monster strikes Maximus..." << endl;
}
string Monster::getName()
{
return Character::getName();
}
void Monster::setName(string newName)
{
Character::setName(newName);
}
myGame.cpp
#include <iostream>
#include "Engine.h"
using namespace std;
int main()
{
//Instantiation
Engine engine;
Character *aCharacter1;
Character *aCharacter2;
//Association
aCharacter1 = new Gladiator;
aCharacter2 = new Monster;
//Fight
Engine->arena(*aCharacter1, *aCharacter2);
//Cleanup
delete aCharacter1;
delete aCharacter2;
}
更新
现在考虑到更正后,我收到以下 4 个错误
Error 1 error C2061: syntax error : identifier 'Character' c:\users\christopher\desktop\paul\school\neit\game architecture\week 4 & 5\christopher-midtermpart2\christopher-midtermpart2\engine.h 13 1 Christopher-MidtermPart2
Error 3 error C2061: syntax error : identifier 'Character' c:\users\christopher\desktop\paul\school\neit\game architecture\week 4 & 5\christopher-midtermpart2\christopher-midtermpart2\engine.h 13 1 Christopher-MidtermPart2
Error 4 error C2511: 'void Engine::arena(Character *,Character *)' : overloaded member function not found in 'Engine' c:\users\christopher\desktop\paul\school\neit\game architecture\week 4 & 5\christopher-midtermpart2\christopher-midtermpart2\engine.cpp 18 1 Christopher-MidtermPart2
Error 2 error C2660: 'Engine::arena' : function does not take 2 arguments c:\users\christopher\desktop\paul\school\neit\game architecture\week 4 & 5\christopher-midtermpart2\christopher-midtermpart2\mygame.cpp 19 1 Christopher-MidtermPart2
【问题讨论】:
-
除非这是学术性的,否则你不应该在现代 C++ 中使用原始指针,最好使用 refs,
std::unique_ptr或std::shared_ptr。 -
在对象上调用
delete时的未定义行为。您的基类析构函数未声明为virtual。 -
arena是一个实例方法。你不能在课堂上调用它。这是engine.arena,不是Engine->arena -
另外,
arena接受指针,因此您必须传递指针,而不是取消引用的值:engine.arena(aCharacter1, aCharacter2)。 -
为什么在不需要时使用
new分配对象?在main中声明它们,类似于声明一个整数变量。
标签: c++ pointers object reference instantiation