0

C++ の (非常に限られた) 知識を更新し、マージ検索メソッドを実装しようとしています。

class Sorter
{
protected:
    vector<int> v;
public:
    Sorter(){};
    Sorter(vector<int> input_vector);
    virtual void sort() = 0;
};    

Sorter::Sorter(vector<int> input_vector)
{
    v.assign(input_vector.begin(), input_vector.end());
}
class MergeSorter : public Sorter
{
public:
        MergeSorter():Sorter(){};
        MergeSorter(vector<int> input_vector):Sorter(input_vector){};
        vector<int> sorted_v;
        MergeSorter* left;
        MergeSorter* right;
        void merge();
        void sort();
};

void MergeSorter::sort()
{
    if(v.size() <= 1)
        return;
    int mid = int(v.size() / 2);
    left->v.assign(v.begin(), v.begin() + mid);
    right->v.assign(v.begin() + mid, v.end() + 1);
    left->sort();
    right->sort();
    left->v.assign(left->sorted_v.begin(), left->sorted_v.end());
    right->v.assign(right->sorted_v.begin(), right->sorted_v.end());
    merge();
    return;
}
...

コンパイルはしますが、に何かを割り当てようとすると、「アクセス違反の読み取り場所」でプログラムがクラッシュしleft->vます。left最初に実際にオブジェクト(および)を作成する必要があると感じていrightますが、同じクラスのオブジェクトであるため、どこでそれを行うのかわかりません。

4

1 に答える 1

0

最初に左(および右)のオブジェクトを実際に作成する必要があると感じていますが、同じクラスのオブジェクトであるため、どこでそれを行うのかわかりません。

正解です。これらは初期化されていないため、作成するまで「使用」できません。コンストラクター内で左と右の構築と割り当てを行うか、コンストラクターでそれらを NULL に初期化し、その時点で未設定の場合は最初に使用する前に設定できる必要があります。

無限ループを引き起こす方法でこれらを構築しないように注意する必要があることに注意してください - コンストラクター内で新しいインスタンスを作成し、コンストラクター内で新しいインスタンスを作成し、それが順番に....

于 2012-07-09T15:38:55.200 に答える