C++(stl)の、std::vectorのresize()について質問です。
前提として、引数ありのコンストラクタだけがpublicになっているクラス(CTestとします)があり、
別クラス(Mainとします)で、CTestのインスタンスを複数格納するためのvectorを用意したとして、
このvectorをresize()で初期化するとした場合、どのようにコーディングするのがよいのでしょうか?
CTestのインスタンスのコピーを作らずにやりたいのですが、それは無理なのでしょうか。
以下に具体的なコードを提示いたします。
コメントアウトしている部分が質問の箇所となります。
何か方法がありましたら、ご教示ください。
#include <iostream>
#include <vector>
#include <string>
//++++++++++++++++++++++
// 任意のクラス
//++++++++++++++++++++++
class CTest {
public:
// 引数つきコンストラクタ(m_paramを初期化します)
CTest( const std::string& param ):m_param( param ) {
std::cout << "Constructor...!" << std::endl;
}
// デストラクタ
~CTest( void ) {
std::cout << "Destructor...!" << std::endl ;
}
// 出力するだけのメソッド
void PrintParam() {
std::cout << m_param << std::endl ;
}
// =演算子
CTest& operator=( const CTest& r ) {
return *this ;
}
private:
// 引数なしコンストラクタは非公開
CTest( void ) ;
// コンストです
const std::string m_param ;
};
//++++++++++++++++++++++
// メイン
//++++++++++++++++++++++
int main() {
// クラスの配列を空で用意
std::vector<CTest> vec ; // vector<CTest*>ではない
// リサイズ数
const int reNum = 2 ;
// リサイズして初期化したいがparamを指定する方法が分からない(><)
//vec.resize(reNum) ; // ←これはparamを指定してないのでコンパイルできない
//vec.resize(reNum, "aiueo") ; // ←これはダメ。コンパイルできない
//vec.resize(reNum, CTest("aiueo")) ; // ←これはコピーを作ることになるのでコンストラクタとデストラクタが呼ばれる
// お試しで表示してみる
for( int i=0, n=vec.size(); i<n; ++i ){
vec[i].PrintParam() ;
}
// 終わります
std::cout << "finish!" << std::endl ;
std::cin.ignore() ;
return 0 ;
}
Windows 7 64bit