成员函数C ++的使用无效

时间:2016-03-11 09:19:51

标签: c++ linked-list

我正在尝试构建一个名为SetList的STL容器,如下所示

template
    <typename T>
class SetList
{
public:
    struct ListNode
    {
        T info;
        ListNode * next;

        ListNode(T newInfo, ListNode * newNext)
            : info(newInfo), next(newNext)
        {
        }

        static ListNode * insert(const char *s)
        {
            *head->info = "test"; //error occurs here, whenever i try to assign head: "invalid use of member ‘SetList<T>::head’ in static member function"
        }
    };

    struct iterator
    {
        typedef std::forward_iterator_tag iterator_category;
        typedef iterator self_type;
        typedef T value_type;
        typedef T& reference;
        typedef ListNode * pointer;
        typedef ptrdiff_t difference_type;
    private:
        pointer buf;
    public:
        iterator(pointer ptr)
            :buf(ptr)
        {   
        }
    };

    SetList() : head(new ListNode("", NULL)) {}
    iterator first(){return iterator(head);}
    iterator last(){return iterator(NULL);}
    ~SetList(){}

private:
    ListNode * head;
};

据我了解,问题与我使用静态这一事实有关,因此this不存在于函数范围内,而是来自我的理解是,我已经在私人领域使用ListNode *head来解决这个问题 - 或者这是不正确的?

我试图为链接列表构建一个简单的插入函数,但无法正确访问头部。

3 个答案:

答案 0 :(得分:3)

由于head不是static,因此每个ListNode都有自己的head。因此,您需要this指针才能访问head 您可以head static,但这实际上意味着所有列表具有相同的头部,并且您实际上只能有一个列表。

更好的解决方案是让insert不是static,这样您就可以访问head并具有逻辑意义,因为您需要说明要插入的列表。< / p>

答案 1 :(得分:0)

您的插入功能不应该是static,也不应该是您节点的一部分。它应该是您的SetList的成员。如果您希望它也是您节点的一部分,那么您应该在节点中创建一个方法,该方法也接受SetList&参数,然后调用列表中的插入。

此外,您现在假设T始终可以从字符串中分配,这可能违背使用模板的要点。

答案 2 :(得分:0)

类/结构中的

static函数或字段由该类/结构的所有实例共享。由于您不需要该类的对象来使用static函数,因此这具有static函数无法访问实例字段的逻辑结果。

在您的示例中,ListNode * head是一个属于某个对象的实例字段,每个对象都有自己的head,因此无法知道哪个head您是在static方法中使用时引用的,因为它们与对象无关(您无法访问这些方法中的this指针)。

对于类中有权访问this指针的方法(为了能够访问实例字段),不需要将它们声明为static