【问题标题】:Initiating a derived class with specific variable values使用特定变量值启动派生类
【发布时间】:2011-07-16 20:18:30
【问题描述】:

对于下面的代码sn-p,如何用变量(如x、y、type)初始化Enemy类的实例?我让它正常工作,无论我插入多少个实例,它都会触发实例......我只需要知道使用某些变量创建敌人的最佳方法,这些变量对于我的每个实例都会有所不同......特别是当一些这些变量中的一个在基类中,而其他变量不在。

class BaseObject
{
public:
    virtual void Render() = 0;
    int x;
    int y;
};

class Enemy : public BaseObject
{
public:

    Enemy() { }
    virtual void Render()
    {
        cout << "Render! Enemy" << endl;
    }

typedef std::set<BaseObject *> GAMEOBJECTS;
GAMEOBJECTS g_gameObjects;

int main()
{
    g_gameObjects.insert(new Enemy());

    g_lootObjects.insert(new Loot());

    for(GAMEOBJECTS::iterator it = g_gameObjects.begin();
    it != g_gameObjects.end();
    it++)
    {
        (*it)->Render();
    }

    for(GAMEOBJECTS::iterator it = g_lootObjects.begin();
        it != g_lootObjects.end();
        it++)
    {
        (*it)->Render();
    }

    return 0;
}

【问题讨论】:

    标签: c++ arrays class game-engine roguelike


    【解决方案1】:

    在敌人构造函数和基构造函数中包含参数。然后,您可以使用它们来初始化成员变量。

    class BaseObject
    {
    public:
        BaseObject(int x, int y) : x(x), y(y){ }
        virtual void Render() = 0;
        int x;
        int y;
    };
    

    class Enemy : public BaseObject
    {
    public:
    
        Enemy(int x, int y, int foo) : BaseObject(x,y), foo(foo) { }
    
        int foo;
    ...
    };
    

    【讨论】:

    • 谢谢!这完美无缺。多么奇怪的语法...您介意为我澄清为什么要键入 : x(x), y(y){} 部分吗? x(x) 中的第一个和第二个 x 对应什么,空的波浪线有什么作用?
    • @motioneffector:一开始可能看起来很奇怪,但你会逐渐喜欢上它。与其他一些语言相比,它真的很不错。
    • 括号表示调用对象的构造函数,squigglies 是函数的主体,在这种情况下是类的空构造函数。这被称为初始化列表,它与在构造函数中为成员变量初始化进行赋值更快更有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多