2011-03-16 73 views
0

對於下面的代碼片段,如何使用變量(如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; 
} 

回答

4

將參數包含在敵方構造函數和Base構造函數中。然後您可以使用這些來初始化成員變量。

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; 
... 
}; 
+0

謝謝!這是完美的。多麼奇怪的語法......你介意爲我澄清爲什麼一個類型:x(x),y​​(y){}部分? x(x)中的第一個和第二個x對應什麼,空虛曲的用途是什麼? – motioneffector 2011-03-16 18:39:50

+0

@motioneffector:起初看起來可能很奇怪,但你會變得喜歡它。與其他一些語言相比,它真的很不錯。 – GWW 2011-03-16 18:40:39

+1

括號表示調用對象的構造函數_squigglies_是函數的主體,在這種情況下是類的空構造函數。這被稱爲初始化器列表,並且是在構造函數中爲成員變量初始化執行賦值的更高效等效。 – AJG85 2011-03-17 22:01:45