如何从链表 return 指针(在 Class 模板中)

How to return pointer from linked list (in Class Template)

我偶然发现我的链表有问题 class。
我有一个抽象 class Shape 和多个 class 继承自它,例如 SquareTriangle
我将它们存储在我的 List class 中,但我不知道如何 return 将存储的对象返回到 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
}

正如您所看到的,我在 return 从我的列表中输入正确的值时遇到了问题,我不知道如何解决这个问题。

这是我的简化列表实现:

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;
        }
    }
}

提前感谢您就如何完成这项工作提出任何建议。

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

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

是否要在列表中存储形状或指向形状的指针?并且您希望 findInstanceAt return 列表中的节点还是指向列表中节点的指针?目前你在这些事情上并不一致

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

您可能需要更改

T* findInstanceAt(int _k)

T findInstanceAt(int _k)