C ++:在构造函数中调用成员函数?

时间:2010-05-10 23:21:59

标签: c++

以下代码引发运行时错误:

#include <iostream>
#include <iterator>
#include <ext/slist>

class IntList :  public __gnu_cxx::slist<int> {
public:
    IntList() { tail_ = begin(); } // seems that there is a problem here
    void append(const int node) { tail_ = insert_after(tail_, node); }

private:
    iterator tail_;
};

int main() {
    IntList list;

    list.append(1);
    list.append(2);
    list.append(3);

    for (IntList::iterator i = list.begin(); i != list.end(); ++i) {
        std::cout << *i << " ";
    }

    return 0;
}

似乎问题出在构造函数IntList()中。是因为它调用成员函数begin()

4 个答案:

答案 0 :(得分:2)

看起来你在end();

之后插入

在构造函数的主体中

IntList() { tail_ = begin(); }

构造基类并且可以调用它的成员,但是对于空列表,它应该返回end();

答案 1 :(得分:2)

您的问题不在构造函数中,而是在第一次调用append()时。因为您的列表为空begin()等于end()end()是一个有效的迭代器,但之后的那个不是。要解决该特定问题,请尝试拨打insert()

也就是说,快速查看<ext/slist>确认slist的析构函数不是虚拟的,这意味着slist并非旨在派生出来。

答案 2 :(得分:1)

slist&lt;&gt;的文档表示提供给insert_after的迭代器必须是可解除引用的。

由于您的列表为空,因此begin()返回end(),因此无法解除引用。

请参阅此处的文档:

http://www.sgi.com/tech/stl/Slist.html
  

iterator insert_after(iterator pos,const value_type&amp; x)

     

pos必须是* this中的可解除引用的迭代器。 (也就是说,pos可能不是end()。)在pos之后立即插入x的副本。返回值是指向新元素的迭代器。复杂性:恒定时间。

答案 3 :(得分:0)

如果您的集合中没有元素,则

.begin()无效。