C++ 如何从链表返回指针(类内模板)

C++ 如何从链表返回指针(类内模板),c++,list,class,oop,templates,C++,List,Class,Oop,Templates,我偶然发现我的链表类有一个问题。 我有一个抽象类Shape和从中继承的多个类,如Square或Triangle等 我将它们存储在我的列表中类中,但我不知道如何将存储的对象返回到形状的指针上 因为我的解释可能看起来很模糊,这里有一些代码解释了预期的行为 class Shape // abstract class { public: int a; //some member virtual methods }; class Square : public Shape { //using the

我偶然发现我的链表类有一个问题。
我有一个抽象类
Shape
和从中继承的多个类,如
Square
Triangle

我将它们存储在我的
列表中
类中,但我不知道如何将存储的对象返回到
形状的指针上

因为我的解释可能看起来很模糊,这里有一些代码解释了预期的行为

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
}

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

在列表中存储Shape*节点,但findInstanceAt返回指向该节点的指针,该节点是Shape**对象。这就是编译器所抱怨的

你可能需要改变

T* findInstanceAt(int _k)


“正如你所看到的,我在从列表中返回正确的值时遇到了一些问题”--不,我们看不到。会发生什么?你认为会发生什么?你有编译器错误吗?如果是的话,他们是什么?在哪条线上?还有<代码>节点*临时=新节点;温度=水头。。。为什么要在堆上分配一个新的
节点
对象,然后立即用另一个指针敲击指针?您只是在这里泄漏内存,甚至不需要首先分配新对象;大概您想要
Node*temp=headstd::list
?;)不是答案,但删除
节点*temp=新节点这是无用的,只会造成内存泄漏。什么是
ShapeList
?如果是某个
列表
,那么
T*
就变成了
Shape**
(正如编译器错误所建议的那样),这根本不是您想要的。也许你想要一个
列表
。我更改了它,现在得到了这样一个信息:“return”:无法从“Shape(u thiscall Node::*)(void)”转换为“Shape*”。我希望我的列表存储指向形状的指针,不幸的是,我现在知道如何回答第二个问题了:(没关系!我忘了在getData调用之后添加括号:)@capybara实际上最好返回
T&
,这样可以根据需要直接修改列表中的对象。您也可以通过这种方式将指针指向它。(
Node::getData()
也需要修改以返回
T&
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 *'  
T* findInstanceAt(int _k)
T findInstanceAt(int _k)