C++ c++;-列表、指针和局部变量
这应该是一个简单的问题,但就我个人而言,我无法在网上找到解决方案 简单地说,创建一个对象并将其添加到指针列表对我来说不起作用-只要我尝试用不同的方法将列表中的项访问到创建它的位置,就会出现访问冲突 所以有两个问题: 1:最好的方法是什么 2:接下来,如果不使用指针列表,那么从列表中删除的最佳方式是什么C++ c++;-列表、指针和局部变量,c++,list,local,C++,List,Local,这应该是一个简单的问题,但就我个人而言,我无法在网上找到解决方案 简单地说,创建一个对象并将其添加到指针列表对我来说不起作用-只要我尝试用不同的方法将列表中的项访问到创建它的位置,就会出现访问冲突 所以有两个问题: 1:最好的方法是什么 2:接下来,如果不使用指针列表,那么从列表中删除的最佳方式是什么 int main( int argc, const char* argv[] ) { std::list<testClass*> list; addClass(list
int main( int argc, const char* argv[] )
{
std::list<testClass*> list;
addClass(list);
std::cout << list.front()->a; //item added to list now longer accessible
}
void addClass(std::list<testClass*> list)
{
testClass* c = new testClass();
c->a = 1; c->b = 2;
list.push_back(c); //item still accessible here
}
class testClass
{
public:
int a;
int b;
};
int main(int argc,const char*argv[]
{
std::列表;
addClass(列表);
std::cout a;//添加到列表中的项目现在不再可访问
}
void addClass(标准::列表)
{
testClass*c=新的testClass();
c->a=1;c->b=2;
list.push_back(c);//项目仍然可以在此处访问
}
类testClass
{
公众:
INTA;
int b;
};
您需要通过引用传递您的列表,您在此处通过值传递,因此它正在制作容器的副本并处理该副本:
void addClass(std::list<testClass*> list)
void addClass(标准::列表)
如果您这样修改它,它应该可以按照您的需要工作:
void addClass(std::list<testClass*> &list)
void addClass(标准::列表和列表)
您需要通过引用传递您的列表,您在此处通过值传递,因此它正在制作容器的副本并处理该副本:
void addClass(std::list<testClass*> list)
void addClass(标准::列表)
如果您这样修改它,它应该可以按照您的需要工作:
void addClass(std::list<testClass*> &list)
void addClass(标准::列表和列表)
第一个宏观错误是,addClass
应该采用std::list&
以便它在main中包含的列表上运行,而不是在本地副本上运行
之后,整个设计必须更好地聚焦:
- 既然
testClass
不是多态的(里面没有虚拟的东西),那么动态地分配它们有什么意义呢?让它们作为值直接包含在列表本身中可能会更容易,它有一个std::list
- 或者。。。如果需要动态分配,还必须考虑<强> DeDebug >,否则将泄漏内存:如果列表保留指针,它将销毁指针,而不是指向它们。
现在,让我们沿着两条轨道:
将对象视为值
您需要一种从给定值构造testClass
对象的方法
class testClass
{
public:
testClass(int a_, int b_)
:a(a_), b(b_)
{}
int a;
int b;
};
现在你可以
void addClass(std::list<testClass>& list)
{
list.emplace_back(1,2);
}
这将在列表中运行,并为每个指针调用delete,从而取消分配(并销毁)分配给new的对象
注意:这不会使列表为空:列表仍然包含指针,它们只是指向无效地址。指针将由main
另一种方法是不使用普通指针,而是使用智能指针,在内容被销毁时自动删除内容
这需要一个std::list
作为容器,以便
void addClass(std::list<std::unique_ptr<testClass> >& list)
{
list.emplace_back(new testClass(1,2));
}
void addClass(标准::列表和列表)
{
列表。安置(新的测试类(1,2));
}
现在,当main
退出时,列表会被自己的元素(智能指针)破坏,而这些元素又会删除新的分配的对象。第一个宏观错误是addClass
应该使用std::list&
对包含在main中的列表进行操作,在本地副本上不存在
之后,整个设计必须更好地聚焦:
- 既然
testClass
不是多态的(里面没有虚拟的东西),那么动态地分配它们有什么意义呢?让它们作为值直接包含在列表本身中可能会更容易,它有一个std::list
- 或者。。。如果需要动态分配,还必须考虑<强> DeDebug >,否则将泄漏内存:如果列表保留指针,它将销毁指针,而不是指向它们。
现在,让我们沿着两条轨道:
将对象视为值
您需要一种从给定值构造testClass
对象的方法
class testClass
{
public:
testClass(int a_, int b_)
:a(a_), b(b_)
{}
int a;
int b;
};
现在你可以
void addClass(std::list<testClass>& list)
{
list.emplace_back(1,2);
}
这将在列表中运行,并为每个指针调用delete,从而取消分配(并销毁)分配给new的对象
注意:这不会使列表为空:列表仍然包含指针,它们只是指向无效地址。指针将由main
另一种方法是不使用普通指针,而是使用智能指针,在内容被销毁时自动删除内容
这需要一个std::list
作为容器,以便
void addClass(std::list<std::unique_ptr<testClass> >& list)
{
list.emplace_back(new testClass(1,2));
}
void addClass(标准::列表和列表)
{
列表。安置(新的测试类(1,2));
}
现在,当main
退出时,列表会被它自己的元素(智能指针)破坏,而这些元素又会删除新的分配对象。当你做一些让你难以理解的事情时,这应该是void addClass(std::list&list)
,你应该先做一个简单的例子。例如,您可以尝试void addInt(int x){x+=5;}int main(){int n=0;addInt(n);}
,注意这不起作用。这样,你可以问一个更有意义的问题,甚至自己发现问题。事实上,这是一个更简单的例子。事实证明,更大的示例(使用静态列表而不是传递列表,并且使用引用而不是指针)似乎有一个我找不到的完全无关的错误。当您正在做一些让您难以理解的事情时,应该是void addClass(std::list&list)
,你应该先做一个简单的例子。例如,您可以尝试void addInt(int x){x+=5;}int main(){int n=0;addInt(n);}
,而不是