1

重複の可能性:
メンバーに対してデフォルト以外のコンストラクターをどのように使用しますか?

私は現在のコードを持っています:

class ImagePoint {
private:
    int row;
    int col;

public:
    ImagePoint(int row, int col){
        this->row = row;
        this->col = col;
    }

    int get_row(){
        return this->row;
    }

    int get_col(){
        return this->col;
    }
};

そして、私はこれをしたい:

class TrainingDataPoint{
private:
    ImagePoint point;
public:
    TrainingDataPoint(ImagePoint image_point){
        this->point = image_point;
    }
};

ただし、この行ではクラスに空のコンストラクターがImagePoint point;必要であるため、これはコンパイルされません。ImagePoint(私が読んだことから)別の方法では、ポインターを使用する必要があると言われています。

class TrainingDataPoint{
private:
    ImagePoint * point;
public:
    TrainingDataPoint(ImagePoint image_point){
        this->point = &image_point;
    }
};

しかし、コンストラクターの実行が終了すると、このポインターはクリアされたオブジェクトを指しますか? もしそうなら、私はのコピーを作成する必要がありimage_pointますか? これにはコピーコンストラクターが必要ですか?

4

5 に答える 5

10

コンストラクタ初期化子リストを使用する必要があります。

TrainingDataPoint(const ImagePoint& image_point) : point(image_point){
}

可能であれば、これを優先する必要があります。ただし、使用しなければならない状況があります。

  • デフォルトコンストラクタのないメンバー(あなたが述べたように)
  • メンバー参照
  • constメンバー
于 2012-10-22T15:22:47.370 に答える
2

そのコードを使用するつもりはないので、これらのことを知る必要はありませんが、完全を期すために:

コンストラクターの実行が完了すると、このポインターはクリアされたオブジェクトを指しますか?

はい、image_pointコンストラクターが終了すると、パラメーターは破棄されます。そうです、オブジェクトへのポインタをオブジェクトに格納し、その後それを使用しようとするのは正しくありません。

その場合、image_point のコピーを作成する必要がありますか?

これで十分ですが、このコードを使用しない理由は、どこにコピーするかという問題です。

これにはコピーコンストラクターが必要ですか?

はい。ただしImagePoint、コンパイラが自動的に生成するコピー コンストラクタが既にあります。

于 2012-10-22T15:42:18.163 に答える
1

コンストラクタ初期化子リストを使用するだけです:

class TrainingDataPoint 
{
private:
    ImagePoint point;
public:
    TrainingDataPoint(const ImagePoint &imgpt) 
         : point(imgpt)
    {
        // other code here as necessary. point has already been initialized
    }
};
于 2012-10-22T15:25:40.797 に答える
1

あなたが読んだものは間違っています。正しい代替手段は、初期化リストを使用することです

class TrainingDataPoint{
private:
    ImagePoint point;
public:
    TrainingDataPoint(ImagePoint image_point) : point(image_point){
    }
};

ちなみに、これはプライベートメンバーとは関係ありません。パブリック メンバーの場合も同じ問題が発生します。

于 2012-10-22T15:23:30.373 に答える
1

コンストラクタ初期化子を使用すると、問題が解決します。

TrainingDataPoint(const ImagePoint& image_point) : point(image_point){
}
于 2012-10-22T17:05:20.557 に答える