[英]stl vector and c++: how to .resize without a default constructor?
如何告訴STL(專門針對vector中的resize()
方法resize()
使用除默認值以外的構造函數以及哪些參數初始化對象?
例如:
class something {
int a;
something (int value);
}
std::vector<something> many_things;
many_things.resize (20);
更一般而言,當STL需要創建對象並將參數傳遞給該構造函數時,如何強制STL使用其構造函數?
就我而言,添加默認構造函數不是一種選擇,並且我不希望使用指針數組來解決該問題。
使用2參數重載: many_things.resize(20, something(5));
我能想到一個解決方案,但警告您,這很丑陋。 我不知道為什么您不想添加默認的構造函數,但是如果您只是想阻止該類的用戶創建未實例化的實例,則可以將默認的構造函數設為私有,並將適當的向量類聲明為好友:
class Foo {
public:
Foo( int x ) : num( x ) {}
int GetX( ) { return num; }
private:
friend class std::vector< Foo >;
int num;
Foo( ) : num( 10 ) {}
};
這很難看,原因有幾個,主要是因為它僅適用於一種容器類型。 沒有其他方法,因為STL容器僅要求其項是默認可構造的。
您可以使用reserve()
增加緩沖區大小,並在循環中手動添加( push_back()
)必要的項。
與專業化一樣(抱歉,我只用很少的支票就寫了這個)?
#include <vector>
class MyClass
{
private:
MyClass();
public:
MyClass(unsigned i) : _data(i) {};
private:
unsigned _data;
};
typedef std::vector<MyClass> MyVector;
void MyVector::resize(MyVector::size_type new_size)
{
this->resize(new_size, MyClass(5));
}
int main()
{
MyVector vector;
vector.resize(5);
return 0;
}
但是,請考慮是否真的需要它。 為什么不創建默認構造函數呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.