0

私は次のようなものを持っています:

#include<vector>

using namespace std;

vector<char> temp;
vector<char> allbytes = GetBytes();
vector<MyClass> outsidecontainer;

for(int i=0; i<allbytes.size(); i++){

    //Populate my buffer
    if(something){
        temp.push_back(allbytes[i]);
    }

    //temporary buffer now needs to be used to create MyClass object 
    //and outside container store this MyClass object
    else{
        MyClass m(temp);
        outsidecontainer.push_back(m);

        //Empty the temporary buffer ready for next population
        temp.clear();
    }
}

class MyClass{
    public:
    MyClass(vector<char> Message);

    private:
    vector<char> Message;
};

問題は、最終的に outsidecontainer が空の MyClass オブジェクトを保持することです。つまり、clear() によって temp が空になったということです。ただし、temp は MyClass m にコピーされ、これも outsidecontainer にコピーされるため、これが outsidecontainer の値に影響を与えるとは思いませんでした。オブジェクトへの参照またはポインタを格納していませんか??

temp を使用して MyClass オブジェクトを作成し、次の人口のためにそれをクリアできるように、上記の設計を実装するにはどうすればよいですか?

編集:

MyClass m にはループ スコープがありますが、値が配列にコピーされたため、outsidercontainer に追加されたオブジェクトはループが終了した後も残りますか?

EDIT2:

#include "FIXMessage.h"


FIXMessage::FIXMessage(vector<char> message){
    Message = message;
}

FIXMessage::FIXMessage(const FIXMessage& rhs){

}
4

2 に答える 2

2

あなたの2番目の編集はこれを示しています

FIXMessage::FIXMessage(const FIXMessage& rhs){
}

これを行うことで、明示的にFIXMessageコピー コンストラクターに何もコピーさせませんでした。これが、このコピー コンストラクターでコピーするすべてのオブジェクトが空になる理由です。はい、ベクトルに要素を追加するときにコピーコンストラクターが使用されます。

独自のコピー コンストラクターを作成する場合は、クラスのすべてのサブオブジェクト (基本サブオブジェクトとメンバー サブオブジェクト) を慎重にコピーする必要があります。手動で行う必要があります。代わりに、すべてのコピーを完全に抑制しました。なんで?

コピーされたオブジェクトが空になるのも不思議ではありません。

しかし、ここでの本当の問題は、手動で実装されたコピー コンストラクターが実際に必要かどうかということです。たぶん、コンパイラが提供するものはうまくいくでしょうか?FIXMessageクラスに含まれるものを見ずに言う方法はありません。

たとえば、 yourFIXMessageに astd::vector以外に何も含まれていない場合、コピー コンストラクターをまったく記述する必要はありません。コンパイラは、すべてを正しくコピーするものを提供します。

最後に、参照と初期化子リストの使い方を学びます

FIXMessage::FIXMessage(const vector<char> &message) : Message(message) 
  {}

のような重いオブジェクトを値渡しstd::vectorしても、よほどの理由がない限り意味がありません。

PSしたがって、投稿した元のコードは偽物でした。偽のコードを投稿しないでください。人の時間を無駄にするだけです。

于 2013-09-21T01:54:36.843 に答える
0

MyClass コンストラクターで何が起こっているのかわからないため、間違っている可能性がありますが、コンストラクターのパラメーターとベクター メンバーが同じ名前を共有しています...これはおそらく問題です。

この MyClass を使用してコードを試してみました:

class MyClass{
    public:
    MyClass(vector<char> Message)
    {
        m_Message = Message;
    }

    private:
    vector<char> m_Message;
};

そして、outsidecontainer ベクトルには、ループの最後、つまり多くの temp.clear(); の後に入力されたすべての値がまだ含まれています。

お役に立てれば

于 2013-09-21T01:48:00.830 に答える