0

次のことを考慮してください: 私は文字列メンバーを含むクラス CDevices を持っています。

class CDevice
{
public:
   CDevice(void);
   ~CDevice(void);

   // device name
   std::string Device_Name;
   etc...
}

コードの別の場所で、CDevices へのポインターのベクトルを含む別のクラスを定義します。

class CDevice;
class CServers
{
public:
   CServers(void);
   ~CServers(void);

   // Devices vector
   vector<CDevice*> Devices;
   etc...
}

問題は、私の main.c の次の行に表示されます

pDevice = new CDevice;

pDevice->Device_Name = "de";
Devices.push_back(pDevice);

pDevice->Device_Name = " revolotiunibus";
Devices.push_back(pDevice);

pDevice->Device_Name = " orbium";
Devices.push_back(pDevice);

pDevice->Device_Name = " coelestium";
Devices.push_back(pDevice);

for(int i = 0; i < (int)Devices.size(); ++i)
    cout << "\nLoad name = " << Devices.at(i)->Device_Name << endl;

私が得る出力は、4 回繰り返される「 coelestium 」です。新しい要素をベクターに push_back するたびに、既存のすべての要素が、追加されたばかりの値を取ります。また、反復子を使用してベクター内の各要素を復元しようとしましたが、同じ結果が得られました。誰かがここで何が悪いのか教えてもらえますか?

ありがとう

4

4 に答える 4

3

問題は、のインスタンスを1つだけ作成することですCDevice。プッシュバックするたびに、同じ1つのインスタンスへのポインターをプッシュバックします。

そして、更新するたびに、その1つのデバイスのをpDevice->Device_Name変更します。Device_Nameしたがって、実際には、同じものへの4つのポインターがあります。そして、あなたが指しているのは、あなたがそれに割り当てた最後の名前を取ることです。

CDeviceあなたはすべてのために新しいものを作る必要がありますpush_back

さらに、これらの新しいCDeviceインスタンスのそれぞれを誰が所有しているかを検討する必要があります。それはあなたのCServersクラスですか?その場合、CServerが削除されると、インスタンス化された各CDeviceを削除する必要があります。ポインタのベクトルを置き換えることで、これを無料で動作させることができます。

std::vector<CDevice*>

スマートポインタのベクトルで。例えば:

std::vector<boost::unique_ptr<CDevice> >

于 2012-07-10T15:14:14.857 に答える
0

You're assigning the device name four times but each time to the Device_Name member of the one-and-only CDevice instance you have. In the end, the Device_Name member of the one-and-only CDevice instance has the last value you assigned, " coelestium".

If you need four CDevices you'll have to create four of them:

pDevice1 = new CDevice;
pDevice1->Device_Name = "de";

pDevice2 = new CDevice;
pDevice2->Device_Name = " revolotiunibus";

....
于 2012-07-10T15:18:49.847 に答える
0

ベクトルでポインターをプッシュしてから、Device_Name フィールドを変更します。

void push_back ( const T& x );

ポインターを使用するため、push_back 関数はポインターをコピーしてベクターにプッシュします。関数はポインターが参照する要素をコピーしないため、1 つのポインターがコード内のベクターに 4 回プッシュされます。

于 2012-07-10T15:17:02.780 に答える
0

同じインスタンスをベクターにプッシュしてから、そのインスタンスの文字列をリセットしています。

ベクターに別のオブジェクトが必要な場合は、新しいオブジェクトを作成する必要があります。

pDevice = new CDevice;
pDevice->Device_Name = "de";
Devices.push_back(pDevice);

pDevice2 = new CDevice;
pDevice2->Device_Name = " revolotiunibus";
Devices.push_back(pDevice2);

// ...

あなたの例は、同じオブジェクトの文字列を何度もリセットし、同じポインターをベクターに4回プッシュするだけです。

于 2012-07-10T15:13:16.673 に答える