1

プログラムの実行時に新しいクラスオブジェクトを動的に作成するメソッドを探しています。これまでのところ、私が読んだことは、それが簡単ではなく、通常、より高度なプログラム要件のために予約されていると私に信じさせます。

私がこれまでに試したことはこれです:

// create a vector of type class
vector<class_name> vect;

// and use push_back (method 1)
vect.push_back(*new Object);

//or use for loop and [] operator (method 2)
vect[i] = *new Object;

これらはどちらもコンパイラからエラーをスローしませんが、私はifstreamを使用してファイルからデータを読み取り、オブジェクトを動的に作成しています...ファイルの読み取りは奇妙なデータを取り込み、メモリアドレスを読み取ることがあります。上記のコードスニペットの使用/誤用が原因です。

ファイル読み取りコードは次のとおりです。

// in main
ifstream fileIn
fileIn.open( fileName.c_str() );

// passes to a separate function along w/ vector
loadObjects (fileIn, vect);

void loadObjects (ifstream& is, vector<class_name>& Object) {
    int data1, data2, data3;
    int count = 0;
    string line;

    if( is.good() ){
        for (int i = 0; i < 4; i++) {    
            is >> data1 >> data2 >> data3;
            if (data1 == 0) {
                vect.push_back(*new Object(data2, data3) )
            }
        }
    }
}
4

4 に答える 4

4
vector<Object> vect;
vect.push_back(Object()); // or vect.emplace_back();

それでおしまい。それが正しい方法、期間です。ファイルからオブジェクトを読み取る際に説明している問題は別の問題であり、何が問題なのかを理解するために、そのコードを確認する必要があります。

ポリモーフィズムが必要な場合は、スマートポインターを使用してください。

vector<unique_ptr<Base>> vect;
vect.emplace_back(new Derived);

何らかの理由でスマートポインタの使用が制限されている場合、これを行うための昔ながらのエラーが発生しやすい方法は次のようになります。

vector<Base *> vect;
vect.push_back(new Derived);
....
for (int i=0; i<vect.size(); ++i)
{
    delete vect[i];
    vect[i] = NULL;
}

もちろん、これは例外安全ではありません。

于 2012-11-14T03:55:24.173 に答える
1
vector<classType> vect;

のタイプを含むベクトルコンテナを宣言しますが、vectにclassType追加しているため、コンパイラは実際に不幸になります。a pointer to classType

オブジェクトpolymorphismをベクトルコンテナに表示する必要がある場合は、オブジェクトへのポインタを格納し、vectタイプを次のように変更する必要があります。

vector<std::shared_ptr<classType> > vect;
于 2012-11-14T03:55:10.110 に答える
1

どうしてもポインタを使用する必要がある場合(オブジェクトは大きなデータセットを内部に格納します)、コードを次のように変更する必要があります。

// create a vector of type class
vector<class*> vect;

// and use push_back (method 1)
vect.push_back(new Object);

//or use for loop and [] operator (method 2)
vect[i] = new Object;

deleteある時点でオブジェクトを使用する必要があることに注意してください。

于 2012-11-14T04:00:32.447 に答える
0

動的オブジェクトの宣言には、次の形式が使用されます。

TypeName * Name = new TypeName

ベクトルを少し速くします。必要なのは、クラスObjectの新しいオブジェクトを作成し、それをベクトルにプッシュすることです。

Object * MyObj = new Object //allocate space for new object
vect.push_back(MyObj) //push back new object

割り当てたものを削除することを忘れないでください。つまり、最後に各要素をループして、そのメンバーを削除します。

for(int i = 0; i < vectLen; i++) //probably will be replaced with iterators for vectors
{
    delete vect[i];
}

動的割り当てについて詳しくは、こちらをご覧ください

于 2012-11-14T03:55:45.187 に答える