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=head(最后)为什么不直接使用std::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)