1

変数として文字列ベクトルを持つクラスと、このベクトルのサイズを設定するために入力を受け取るコンストラクターがあります。唯一の問題は、ベクトル内の要素にデフォルト値がまったく設定されていないことです。ここで何が問題になっていますか?サイズ変更と割り当ての両方を試しましたが、毎回空白になってしまいます。

クラス:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Lab
{
private:
    vector<string> station;
    int id;

public:
    Lab()
    {
        station[0] = "Empty";
        id = 0;
    };
    Lab(int ID, int size)
    {
        station.assign(size, "Empty");
        id = ID;
    };
    Lab(const Lab& labcpy)
    {
        station.resize(labcpy.station.size());
        id = labcpy.id;
    };

ベクトルのサイズが設定されているメイン:

#include <fstream>
#include "lab.h"
using namespace std;
int main(int argc, char* argv[])
{
    ifstream labnumber_file(argv[1]);
    vector<Lab> lab_v;

    int labnum;
    int usernum;
    while(!labnumber_file.eof())
    {
        labnumber_file >> labnum;
        labnumber_file >> usernum;

        lab_v.push_back(Lab(labnum, usernum));
    }
4

4 に答える 4

4

問題は、コピーコンストラクターをpush_back使用することですが、コピーコンストラクターはに何もコピーしませんstation

データメンバーは安全にコピーできるため、デフォルトのコピーコンストラクターを使用するだけです。定義したコピーコンストラクターを削除します。

3つのルールは、デストラクタを定義する必要がある場合は、コピーコンストラクタと代入演算子も定義する必要があるということです。ただし、デストラクタを定義する必要がないため、ルールはLabクラスに適用されません。

于 2012-07-04T07:13:13.450 に答える
2

コピーコンストラクターでは何もコピーstationせず、値をコピーせずにベクトルのサイズを変更するだけです。引数としてstationのコピーコンストラクタを使用するだけです。labcpy.stationしかし、あなたは何を知っていますか、とにかくコピーコンストラクターを実装する必要はありません。コンパイラーが生成したコンストラクターはここで完全に機能するからです(コピーstationとだけなのでid)。

また、要素station[0]を持たずにアクセスするため、デフォルトのコンストラクターは未定義の動作を呼び出します。station

最後になりましたが、デフォルトの構造に続いて割り当てを行うのではなく、初期化リストを使用する必要があります。(関数定義の後にセミコロンを付けないでください。)

class Lab
{
private:
    vector<string> station;
    int id;

public:
    Lab()
        : station(1, "Empty"), id(0)
    {
    }
    Lab(int ID, int size)
        : station(size, "Empty"), id(ID)
    {
    }
};
于 2012-07-04T07:35:26.180 に答える
2

交換:

station.resize(labcpy.station.size());

station = labcpy.station;

コピーコンストラクターで。スペースを割り当てるだけで、データをコピーしていません。ベクトルの代入演算子を使用してデータをコピーするだけです。また、サイズ変更も処理します。

補足:配列演算子[]は境界チェックを行わないため、使用を避けたい場合があります。

于 2012-07-04T07:21:20.163 に答える
0

まず、

    Lab(const Lab& labcpy)
    {
         station.resize(labcpy.station.size());
         id = labcpy.id;
    };

ここでは、ベクトルのサイズを変更しますが、値を追加しません。したがって、これを使用してデフォルトの構成をコピーするLabと、サイズが変更されるだけで、新しい要素(おそらく空の文字列として初期化される)に文字列値が割り当てられなくなります。次に、代入演算子も実装する必要があります

于 2012-07-04T07:13:22.593 に答える