c ++:包含自身对象的类,初始化

时间:2012-07-09 15:37:33

标签: c++

我尝试刷新我(非常有限的)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),但不知道我在哪里这样做,因为它是同一个类的对象。

1 个答案:

答案 0 :(得分:0)

  

我觉得我需要先向左(和右)创建一个对象,但不知道我在哪里做,因为它是同一个类的对象。

这是对的。在你创建它们之前,它们不能被“使用”,因为它们将是未经初始化的。您应该能够在构造函数中构造和赋值左右,或者在构造函数中将它们初始化为NULL,并在第一次使用之前设置它们,如果它们在那时未设置的话。

请注意,您需要注意不要以导致无限循环的方式构造它们 - 在构造函数中创建一个新实例,然后创建一个新实例,反过来....