2013-04-04 62 views
38

我有一個C++向量。我想讓矢量保持可變數量的對象。如何在將對象添加到矢量中時創建對象?

的Visual Studio 2012是給我的錯誤:

Error: type name is not allowed 

從本C++代碼:

#include <iostream> 
#include <vector> 
using namespace std; 

class testObject{ 
private: 
    int someInt; 
public: 
    testObject(int a){ someInt=a; } 
    void show() { cout<<someInt<<endl; } 
}; 

int main() 
{ 
    vector<testObject> testVector; 
    cout << "Initial size: " << testVector.size() <<endl; 

    for (int i = 0; i < 3; i++) 
     testVector.push_back(testObject(3)); 
    cout << "New size: " << testVector.size() << endl; 

    for (int j = 0; j < 3; j++) 
     testVector[ j ].show(); 

    system("pause"); 
}  

但這裏看起來相同的代碼,另一個樣本,但它不工作。

void Dealer::setNumberOfPlayers(const int tNumber) 
{ 
    for (int i = 0; i < tNumber; i++) 
     vectorOfGamers.push_back(Player); // Player is a class that I created 
} 

我可以創建矢量來同時容納經銷商,機器人和播放器的對象嗎?我怎麼做?據我所知,矢量中的所有對象應該是一種類型。

+6

+1的適定的問題(你的英語相當好)。 – Cameron 2013-04-04 03:30:17

+2

創建播放器的一個實例。 – Arun 2013-04-04 03:31:18

+0

重複但是,這兩個問題的答案可以很容易地通過谷歌或甚至在這裏找到。 – 2013-04-04 03:42:10

回答

48

要回答你的問題的第一部分,你必須創造型球員的對象,然後才能使用它。當你說push_back(Player),它的意思是「玩家添加到載體」,而不是「添加型播放器的目的是矢量」(這是你的意思)。

您可以在棧像這樣上創建對象:

Player player; 
vectorOfGamers.push_back(player); // <-- name of variable, not type 

或者你甚至可以創建一個臨時對象內聯和推送(當它擺在矢量它被複制):

vectorOfGamers.push_back(Player()); // <-- parentheses create a "temporary" 

要回答的第二部分,可以創建基類型,這將允許你要推回任何亞型對象的矢量;然而,預期這將無法工作:

vector<Gamer> gamers; 
gamers.push_back(Dealer()); // Doesn't work properly! 

因爲當經銷商物體放入載體,它被複制爲玩家對象 - 這意味着只有部分玩家被有效複製「切片「 物體。您可以使用指針,不過,此後只有指針會被複制,而對象是永遠不會切片:

vector<Gamer*> gamers; 
gamers.push_back(new Dealer()); // <-- Allocate on heap with `new`, since we 
            // want the object to persist while it's 
            // pointed to 
+1

@eoLithic:它工作在第一樣品中,因爲它創建一個臨時對象(以下簡稱「類型(構造函數參數)」語法),並通過在,儘管在相似語法,它有一個非常不同的含義;-) – Cameron 2013-04-04 03:39:32

+0

謝謝你的幫助。我想,我們可以關閉這個線程。 – eoLithic 2013-04-04 03:41:44

+0

是否有可能做到最後一部分*沒有*分配在堆上(仍然有多態性)? – mtahmed 2014-11-04 01:50:45

5

問題1:

vectorOfGamers.push_back(Player) 

這是問題,因爲你不能直接推類名到載體中。 您可以將類的對象推入向量中,也可以將引用或類類型的指針推入向量中。例如:

vectorOfGamers.push_back(Player(name, id)) 
    //^^assuming name and id are parameters to the vector, call Player constructor 
    //^^In other words, push `instance` of Player class into vector 

問題2:

These 3 classes derives from Gamer. Can I create vector to hold objects of Dealer, Bot and Player at the same time? How do I do that?

當然可以。您可以創建指向基類Gamer的指針向量。 一個不錯的選擇是使用smart_pointer的矢量,因此,您不需要自己管理指針內存。由於其他三個類來自Gamer,基於多態性,您可以將派生類對象分配給基類指針。你可以從這個帖子找到更多的信息:std::vector of objects/pointers/smart pointers to pass objects (buss error: 10)?

1

您不能插入類爲載體,可以插入對象(提供它是適當的類型或可轉換的)。

如果該類型Player有一個默認的構造函數,你可以通過做Player()創建一個臨時的對象,並應爲你的情況下工作:

vectorOfGamers.push_back(Player()); 
0
// create a vector of unknown players. 
std::vector<player> players; 

// resize said vector to only contain 6 players. 
players.resize(6); 

值總是被初始化,所以矢量6個玩家是6個有效玩家對象的矢量。

至於第二部分,你需要使用指針。 Instantiating c++ interface as a child class

相關問題