C++ c++;-列表、指针和局部变量

C++ c++;-列表、指针和局部变量,c++,list,local,C++,List,Local,这应该是一个简单的问题,但就我个人而言,我无法在网上找到解决方案 简单地说,创建一个对象并将其添加到指针列表对我来说不起作用-只要我尝试用不同的方法将列表中的项访问到创建它的位置,就会出现访问冲突 所以有两个问题: 1:最好的方法是什么 2:接下来,如果不使用指针列表,那么从列表中删除的最佳方式是什么 int main( int argc, const char* argv[] ) { std::list<testClass*> list; addClass(list

这应该是一个简单的问题,但就我个人而言,我无法在网上找到解决方案

简单地说,创建一个对象并将其添加到指针列表对我来说不起作用-只要我尝试用不同的方法将列表中的项访问到创建它的位置,就会出现访问冲突

所以有两个问题:

1:最好的方法是什么

2:接下来,如果不使用指针列表,那么从列表中删除的最佳方式是什么

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);}
,而不是