gpt4 book ai didi

c++ - 保留对象并引用在函数内部创建的对象

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:50 24 4
gpt4 key购买 nike

我是 C++ 的新手,所以仍在学习指针并习惯使用它们。

我已经声明了一个对象映射,以便存储用户以后可能使用标签键访问的对象。

map<string,MyObject*> myMap;

我添加到 myMap 的对象是在我的 main 调用的函数中创建的

void myFunction(){
...
MyObject obj1();
MyObject* objPtr;
objPtr = &obj1;
myMap.insert(pair<string,MyObject*>("xxxx", objPtr));
...
}

当我执行这个函数时,对象指针被完美地插入到 myMap 中,但是在函数执行之后我失去了对 obj1 的引用我猜是因为指针和对象是在函数内部本地创建的,所以我仍然有一个元素“xxx"在 map 中,但我认为之后是一个空引用。

如何在全局范围内保留对象和引用?我想在函数中创建这个对象,因为它有一些需要从用户 obj1(m,n) 获取的可变参数。感谢您的帮助。

最佳答案

代码行

MyObject obj1;

定义一个本地 变量,它包含一个MyObject 的实例。一旦这个变量的上下文即将离开,对象就会被销毁。对象的销毁并不意味着指向它们的指针将以任何方式得到通知(例如它们未设置为 0),访问它们是无效的。

您基本上有以下选择:

  • 而不是本地创建对象。这是使用 new 关键字完成的。但随后您必须在某个时候删除该对象。

    MyObject *obj1 = new MyObject(arguments...);
  • 由于这通常难以管理,因此发明了智能指针。例如,从 C++11 开始,添加了 shared_ptr(但它也适用于预发布版本 C++0x 的某些编译器)。这种类型的智能指针会在最后一个引用被销毁时自动为你删除对象。

    map<string,std::shared_ptr<MyObject>> myMap; // Note that I changed the type

    std::shared_ptr<MyObject> obj1 = std::make_shared<MyObject>(arguments...);
    myMap.insert(std::make_pair("xxxx", obj1));

    顺便说一下,我使用了 std::make_pair,它会自动 deduce the template types for you .

  • 在 map 中存储值。根本不要使用指针。如果您的类型可以被复制(某些类型不能)以及您的某些设计决策不禁止您这样做,则这是一个选项。但在大多数情况下,将值存储在 map 中是个好主意。从要修改的 map 中获取元素时请使用引用:

    MyObject &obj = myMap["xxxx"]; // looking up the key
    obj.doSomeAction(); // modify it; no need to re-insert

    引用的行为类似于指针(即它们仅“指向”某个实例),但存在一些差异。例如,引用在其生命周期内始终指向同一个实例(您不能重新分配引用)。此外,它们的语法等于值,即不需要 ->

就个人而言,如果您不需要在程序的多个位置放置指向同一个对象的指针,我更喜欢第三个选项。如果是这种情况,我们就会说“共享”对象,这正是您想要使用“共享”指针的情况。第一个选项非常低级,应被视为“过时”。

关于c++ - 保留对象并引用在函数内部创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19623550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com