如何从链表返回指针(在类模板中)

时间:2015-01-14 22:32:42

标签: c++ list class oop templates

我偶然发现我的链表类有问题 我有一个抽象类Shape和从中继承的多个类,如SquareTriangle等。
我将它们存储在我的List类中,但我不知道如何将存储的对象返回到Shape的指针。
由于我的解释看起来很模糊,所以解释了一些具有预期行为的代码。

class Shape // abstract class
{
public:
 int a;
//some member virtual methods
};

class Square : public Shape
{
//using the virtual methods from Shape
};

在我的主文件中,这就是我想要使用它的方式:

int main()
{
    List<Shape*> ShapeList;
    Shape *ptr;
    Square a(2, 1, 1); // size, x, y coordinates
    ShapeList.add(ptr);

//up to this point everything works well
// now I want my list to return a pointer to it's member 
// so I can modify it

    Shape *listptr;
        listptr = ShapeList.findInstanceAt(0); // here's my error

    listptr->a = 5; // what I want to do next
}

因为你可以看到我从列表中返回正确的值并且我不知道如何解决这个问题。

这是我的简化列表实现:

template <class T> class Node
{
            T data; 
            Node *next; 

    public:             

            inline T getData()
            {
                return data;
            }

            inline Node* getNext()
            {
                return next;
            }
};


template <class T> class List
{
    Node<T> *head, *tail;

public:

    List() : head(NULL), tail(NULL) { }

    T* findInstanceAt(int _k)
    {
        if (NULL == head)
        {
            cout << "\nList is empty.";
            return NULL;
        }
        else
        {
            Node<T> *temp = new Node<T>;
            temp = head;

            for (size_t k = 0; k < _k; ++k)
            {
                if (NULL != temp->getNext()) temp = temp->getNext();
                else return NULL;
            }

            return temp->getData;
        }
    }
}

提前感谢您提供有关如何开展此项工作的任何建议。

@EDIT
啊,我忘了添加我得到的编译器错误:

Error   1   error C2440: '=' : cannot convert from 'Shape **' to 'Shape *'  

1 个答案:

答案 0 :(得分:1)

是否要将形状或指针存储到列表中的形状?您是否希望findInstanceAt返回列表中的节点或指向列表中节点的指针?目前你对这些事情并不一致

您在列表中存储Shape *节点,但findInstanceAt返回指向节点的指针 - 这是一个Shape **对象。这就是编译器抱怨的内容

你可能需要改变

T* findInstanceAt(int _k)

T findInstanceAt(int _k)