0

ブロックへの2つのポインターを持つ次のクラスがあります

#ifndef SCORING_H
#define SCORING_H

#include "Block.h"
#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

class Scoring
{
    public:
        Scoring(Block *, Block*, string, string, double);
        virtual ~Scoring();
        Scoring(const Block& b1, const Block &b2);
    private:
        Block * b1;
        Block * b2;
        string path1;
        string path2;
        double val;
};

#endif // SCORING_H

クラスブロックは次のとおりです。

class Block {
    public :
        ///constructo
        Block(double, double, double, double, int, vector<LineElement*>);

        ///Setter functions
        void setID(int);
        void setTop(double);
        void setLeft(double);
        void setRight(double);
        void setBottom(double);
        void setLine(vector<LineElement*>);

        int getID();
        double getTop();
        double getLeft();
        double getBottom();
        double getRight();
        vector<LineElement*> getLine();

    private:
        int id;
        vector<LineElement*> Listline;
        double top;
        double left;
        double bottom;
        double right;
};

#endif // ELEMENT_H_INCLUDED

私が知りたいのは、「Block * b1;Block * b2」のコピー コンストラクターを作成する必要があるかどうか、およびこれらの 2 つのポイントをクラスの score.h でどのように処理できるかです。

ありがとうございました。

4

1 に答える 1

1

プレーンでシンプル以外のコンストラクターを作成する場合Block::Block(const Block&)、それはコピー コンストラクターではありません。Scoring2 つのポインターを使用してコンストラクターを作成する場合、Blockそれは間違いなくコピー コンストラクターではありません。

コピーコンストラクターが必要な場合は、次のScoringようにする必要があります。

class Scoring
{
    // ...

    Scoring(const Scoring& other);

    // ...
};

次に、そのコンストラクターで次からコピーしますother

Scoring::Scoring(const Scoring& other)
    : b1(new Block(*other.b1)),
      b2(new Block(*other.b2)),
      path1(other.path1),
      path2(other.path2),
      val(other.val)
{
}

もちろん、Blockクラスにはポインターのベクトルが含まれているため、おそらくコピーコンストラクターも作成する必要があります。そうしないと、同じオブジェクトを指すポインターを持つ2つのベクトルが作成されます。これらのオブジェクトを 1 つのベクトルで削除しますが、他のベクトルでは削除しません。

于 2013-05-30T13:07:56.870 に答える