簡體   English   中英

如何使用 std::vector 動態實例化具有參數化構造函數的類?

[英]How to dynamically instantiate a class with parameterized constructor using std::vector?

我想使用向量動態實例化對象,但是,我不知道如何將參數傳遞給構造函數。

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

class Player {
    
    public:
    Player(int id, string name)
     : p_id(id)
     , p_name(name)
                                                                                     
  {
  }
  
   public:
      int p_id;
      string p_name;
   };

int main() {

vector<Player>  player;      **//How to instantiate the object with parametrized constructor** 
    
player.resize(sizeof(player));
  
return 0;
   
}

我想,你可能想看看這個:

class Player {
public:
    Player() = default;
    Player(int id, string name): p_id(id), p_name(name) {}
private:
    int p_id;
    string p_name;
};

int main() {
    vector<Player> players;
    // construct a Player from an int and a string 
    players.emplace_back(33, "Foo");
}

在這里,我們使用std::vector成員函數emplace_back() ,它在向量內部(在后面)構造一個對象。


您的代碼中還有其他需要注意的事項:

players.resize(sizeof(players)); // Is nonsensical

您應該檢查文檔std::vector::resize文件sizeof() 簡而言之,我們可以使用resize(n)來改變容器中元素的數量。

我們可以通過提供大於當前size() n增加元素的數量 在這種情況下,會附加其他默認插入的元素。

或者通過提供較小的n減少容器中的元素數量 在這種情況下,容器的內容被減少到它的前n元素,刪除那些超出(並銷毀它們)。

請注意,此函數會更改容器的實際內容:

players.emplace_back(11, "Foo");
players.emplace_back(22, "Bar");
players.emplace_back(33, "Buz");

players.resize(2); // Now, players.size() == 2
// ...and there are no Buz among the players

這就是為什么將sizeof(players)傳遞給resize()是沒有意義的,尤其是當我們考慮到sizeof()返回多個字節時

如果你想有一個vector與一些數量的預構建的Player在它的對象,你應該使用矢量的填充構造函數

// Ten objects of class Player
vector<Player> players(10, Player(0, ""));
// Ten default constructed objects of type Player
vector<Player> players(10);  // Player has to have a default constructor

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM