-1

オブジェクトをベクターに渡し、同時に作成することはできますか? 例を挙げて、私が何を意味するかを説明しようとします。

#include <vector>

class testObject{
private:
   int someInt;
public:
   testObject(int a){ someInt=a; }
};

int main() {
   std::vector<testObject> testVector;
   testVector.push_back(testObject(2));
}

上記のコードに似たものを使用してみました。当然のことながら、実際にベクターに追加されたオブジェクトはありません。私が理解している限りtestObject(2)、のインスタンスを作成しますがtestObject、コンストラクターが終了した瞬間に範囲外になります。

アップデート:

親愛なるヘルパー/アドバイザー。回答ありがとうございます。すべてのコメントとコード例を読み、質問を少し変更する必要があります。クラスにメンバーを追加しましたtestObject。オブジェクトのインスタンスをベクターに追加すると (上記の例に示すように)、メンバーは空に見えます。今、私はそれを行うためにメモリを割り当てる必要があると思いますか? new通常、私はメモリ リークを恐れており、自分のプログラミング スキルにまだ自信がないため、メモリの割り当てを避けようとします。最も賢明な実装は何でしょうか?

4

4 に答える 4

2

それはいくつかのマイナーな修正で動作します:

 class testObject{
 public:
       testObject(int){
       }
    };

int main()
{
  vector<testObject> testVector;
  testVector.push_back(testObject(2));
} 

この世界は進んでいます。可能であれば、コンパイラを最新のバージョンにアップグレードしてください。私は VC6.0 を何年も見ていません。

于 2013-01-18T10:54:46.427 に答える
1

コードについては、billzの回答が正しいです。

あなたの不安に対処するには:

オブジェクトのインスタンスをベクターに追加すると (上記の例に示すように)、メンバーは空に見えます。

問題なく動作するはずです。これをどのように判断しているかを示してください。

今、私はそれを行うためにメモリを割り当てる必要があると思いますか?

コンパイラは、既定のメンバーごとのコピー コンストラクターを生成する必要があります。メンバーがすべて値型である場合 (ここのように)、これは通常、正しい浅いコピーになります。

ロギングまたはブレークポイントを追加する場所が必要な場合は、自分で明示的に記述できますが、次の必要はありません。

class testObject{
private:
   int someInt;
public:
   explicit testObject(int a) : someInt(a) {}
   // compiler should automatically handle copy like this:
   testObject(testObject const &other) : someInt(other.someInt) {}
   // and handle assignment like this:
   testObject& operator=(testObject const &other) {
      someInt = other.someInt;
      return *this;
   }
};

通常、私はメモリ リークを恐れており、自分のプログラミング スキルにまだ自信がないため、new によるメモリの割り当てを避けようとします。最も賢明な実装は何でしょうか?

上記のような値型については気にする必要はありません。参照型が必要な場合のベスト プラクティスは、それらをスマート ポインターまたは専用クラスでラップして、それらを値型として扱うことができるようにすることです(また、コンパイラによって生成されたものを機能させることで、コピー コンストラクター、代入演算子、およびデストラクターを記述する必要がなくなります)。正しく)。残念ながら、このアドバイスが VC++ 6.0 とどの程度互換性があるかわかりません。

于 2013-01-18T14:00:22.007 に答える
1

まず、何らかのコーディング標準に従うことをお勧めします。完璧ではありませんが、Google には適切なコーディング スタイル ガイドがあり、採用することができます。

コードで何をしようとしても、Object という名前のクラスに対して何らかのテストを作成する場合を除き、クラスに別の名前 (TestClass など) を選択することを考えることができます。これは単なる意図の問題です。C++ の OO 機能をテストする場合、TestClass は testObject よりも理にかなっています。

また、実際にオブジェクトをベクターに追加したことを確認できるコードは、この例にはありません。このようなものでそれを行うことができます。

... some code here ...

int main()
{
    std::vector<testObject> testVector;
    std::cout << "Initial size: " << testVector.size() << std::endl;

    testVector.push_back(testObject(3));
    std::cout << "New size:     " << testVector.size() << std::endl;
}

標準 I/O ストリームの操作方法を知っているかどうかはわかりませんが、この例では I/O を扱っていないため、完全を期すために例に I/O を追加してください。

前の例と一貫性を保つために、私があなたに与えた文体に関するアドバイスを適用することを意図的に省略しました。これは、コンテキスト内での一貫性も優れたプログラミング スタイルの重要な特徴であるためです。

最後に、元の質問に答えるために、を使用している場合push_back、C++ はベクターの裏側に一時オブジェクトをコピーします。(すでに @FredOverflow で説明されています。)これは基本的に、ベクターがメモリ管理を処理することを意味するため、割り当てや割り当て解除について心配する必要はありませんが、唯一の懸念は、オブジェクトを実際に格納した場所 (つまり、どのインデックス) です。

于 2013-01-18T22:14:16.183 に答える
1
std::vector<testObject> testVector;
testVector.push_back(testObject(2));

C++11 でのより高速な代替手段は、ベクトルに testObject を作成させることです。

testVector.emplace_back(2);

これにより、不要なコピーや移動が行われなくなります。

于 2013-01-18T16:45:22.973 に答える