1

コードは次のとおりです。

コード :

#include <iostream>

using namespace std;

class pub
{
    string name;

    public:
    pub(string name):name(name){}    //Constructor
    void getName(string name){this->name = name;}
    string returnName(void){return name;}
};

int main(void)
{
    pub * p = new pub[5]; //Error-prone statement.

                          //Ignore for not having "delete" statement

    return 0;
}

質問 :

1.)この場合、割り当てた各動的メモリに値を渡す方法はありますか、それともこの問題を回避するためにコンストラクターの引数にデフォルト値を設定する必要がありますか?

ありがとうございました !

4

3 に答える 3

3

std::vectorコンパイラがC++11をサポートしている場合は、イニシャライザリストを使用できます。

std::vector<pub> v { pub("1"), pub("2") };

オンラインデモhttps://ideone.com/Qp4uoを参照してください。

またはstd::array

std::array<pub, 2> v = { { pub("1"), pub("2") } };

オンラインデモhttps://ideone.com/lBXUSを参照してください。

delete[]これらのいずれも、動的に割り当てられたアレイの負担を取り除きます。

于 2012-08-14T15:08:51.890 に答える
1

getName()あなたが使用したやや不自然な命名規則(私はとに変更しsetName()、プライベートデータメンバーを示すために末尾を使用returnName()しました)とは別に、 `std ::vectorを使用するとメモリ管理が自動的に行われます:getName()_

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class pub
{
public:
    pub(): name_("default") {}
    pub(string const& name): name_(name){}    //Constructor
    pub(const char* name): name_(name) {}
    void setName(string const& name){ name_ = name;}
    string getName(void) const {return name_;}

private:
    string name_;
};

int main(void)
{
    // initialize with 2 elements, then add 3 more default elements
    std::vector<pub> pub_vec { "bla", "bar" };
    pub_vec.resize(5);

    std::for_each(pub_vec.begin(), pub_vec.end(), [](pub const& elem){
        std::cout << elem.getName() << "\n";
    });

    return 0;
}   // 5 destructors automatically called

注:を使用するオーバーロードされたコンストラクターを追加すると、const char*文字列リテラルを使用してデータを初期化できます。

Ideoneの出力

于 2012-08-14T15:10:55.523 に答える
0

を使用しstd::vector<pub>ます。デフォルトのコンストラクターは必要ありません。

例えば

std::vector<pub> vec(5, pub("xyz"));

5つの等しい要素を持つベクトルを作成します。

于 2012-08-14T15:06:24.603 に答える