面向对象的编程风格和指针指针

时间:2013-06-20 17:47:19

标签: c++ oop linked-list

我想在C ++中创建一个简单的链表类和其他数据结构,以习惯面向对象的编程。在编辑我的旧C代码后,我有类似的东西(我刚刚包含了其中一个函数):

template<typename T> class llist
{
    public:
        T data;
        llist<T>* next;

        llist() {next=nullptr;}
        llist(const T& d) {data=d;next=nullptr;}
};

template<class T> llist<T>** llistAdd(llist<T> **l,const T& d)
{
    llist<T> *temp=*l;
    (*l)=new llist<T>(d);
    (**l).next=temp;
    return &(**l).next;
}

使用方法如下:

int main()
{
    llist<int>* my_integer_list = nullptr;

    llistAdd(&my_integer_list,42);
    llistAdd(&my_integer_list,128);
    llistAdd(&my_integer_list,1337);

    for(auto itr = &my_integer_list; (*itr) != nullptr; llistItrAdv(&itr))
        cout<<(**itr).data<<endl;

    llistClear(&my_integer_list);

    return 0;
}

哪一切都很完美。问题是C ++ OOP风格使用方法而不是像llistAdd(..)这样的函数。问题是我的代码使用指针指针甚至是指向指针的指针(参见llistItrAdv(..))。如果我使用方法,我需要做类似的事情:

template<typename T> llist<T>* llist<T>::Add(const T& d)
{
    llist<T> *temp = new llist<T>(d);
    temp->next = this;
    return temp;
}

int main()
{
    llist<int>* my_integer_list = nullptr;

    my_integer_list = my_integer_list->Add(42);

    my_integer_list = my_integer_list->Clear();

    return 0;
}
然而,这会使代码变得丑陋,并且容易出现内存泄漏。必须有更好的方法来做到这一点,但我真的无法想到任何事情。我试图为指针创建方法,但这在C ++中是非法的。你们可以教我如何正确的OOP式交易课程吗?

1 个答案:

答案 0 :(得分:3)

您遇到的问题源于您的llist类实际上是链接列表中的单个节点,而不是整个列表,因此它具有{ {1}}方法。你会注意到你的非OOP代码实际上就是这种情况 - add函数不是作用于llistAdd对象,而是作用于一个对象(这里只是一个指针)引用llist对象。这表明了您的问题的解决方案:将旧类重命名为llist并创建一个新的llistnode类,其中包含指向列表头部llist的指针以及此新类实施

llistnode