【问题标题】:C++ Character battle code issueC++字符战斗代码问题
【发布时间】: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_ptrstd::shared_ptr
  • 在对象上调用 delete 时的未定义行为。您的基类析构函数未声明为 virtual
  • arena 是一个实例方法。你不能在课堂上调用它。这是engine.arena,不是Engine-&gt;arena
  • 另外,arena 接受指针,因此您必须传递指针,而不是取消引用的值:engine.arena(aCharacter1, aCharacter2)
  • 为什么在不需要时使用new 分配对象?在main 中声明它们,类似于声明一个整数变量。

标签: c++ pointers object reference instantiation


【解决方案1】:

您的void arena(Character*, Character*); 方法将指针指向字符,但您试图传递指针指向的实际对象:
Engine-&gt;arena(*aCharacter1, *aCharacter2);
将此行更改为
Engine-&gt;arena(aCharacter1, aCharacter2); 或更改您的方法,使其可以将对象作为参数而不是指针:
void arena(Character, Character);

另外,正如Giulio Franco 提到的:
arena is an instance method. You cannot call it on a class. It's engine.arena, not Engine-&gt;arenaPaulMcKenzie 提到的:
Undefined behavior when you call delete on your objects. Your base class destructor is not declared as virtual

【讨论】:

    【解决方案2】:

    1) 将 Character 析构函数声明为 virtual

    原因是在main 中,您正在通过基类指针删除指向派生对象的指针。一旦你这样做了,基类必须有一个声明为virtual的析构函数,否则行为是未定义的。

    所以你需要有这个:

    virtual ~Character();
    

    然后在main 中,现在已经定义了行为:

    //Cleanup
    delete aCharacter1;
    delete aCharacter2;
    

    2) 您必须将指针传递给arena 函数,而不是对象。

    engine.arena(aCharacter1, aCharacter2);
    

    【讨论】:

    • Engine 是一个类,arena 是一个非静态成员函数。
    • @PaulMcKenzie 很好地抓住了虚拟机。我忘了把它放在那里作为析构函数。我必须养成把它放在那里的更好习惯。
    • @PaulMcKenzie 现在在构建时出现错误。将用问题更新主线程。
    • Engine 使用 Character,但 Engine 不知道 Character 是什么。将Character 的定义移到Engine 之前。
    • @PaulMcKenzie 啊,我明白了。因为它试图利用技术上尚未创建的东西,所以它会发疯。感谢您的帮助,我对此理解得更好一些。在使用指针和 * 时我遇到了一些问题。
    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2015-09-27
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多