2013-10-27 70 views
0

我是C++的新手,所以仍然在学习指针并习惯于使用它们。保持对象和引用在函数内创建的对象

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

map<string,MyObject*> myMap; 

我加入到MYMAP对象在一个由我主

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

当我执行此功能的对象的指针是完全插入到MYMAP,但功能执行后调用函数创建我猜我失去了对obj1的引用,因为指针和对象是在函数内部本地创建的,所以我在地图中仍然有一个元素“xxx”,但是我认为它是后面的空引用。

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

+2

为什么你不能在地图中存储对象的任何原因?这将大大简化事情。 – juanchopanza

+0

为什么不使用'objPtr = new MyObject();'而不是'MyObject obj1(); objPtr = &obj1;'?这会在堆上创建超出函数范围的对象。但是,在完成对象和地图的使用后,需要删除对象。在你的例子中,该对象在堆栈上创建并在函数完成后删除。 – MKroehnert

+0

你可能想了解'new'关键字。 –

回答

2

除非你有很强的理由不这样做用它来删除这种情况下,它可能是简单的存储对象图:

map<string, MyObject> myMap; 

然后:

void myFunction(){ 
    ... 
    myMap.insert(std::make_pair("xxxx", MyObject())); 
    ... 
} 
+0

我刚刚做了,它解决了问题... Thansk – JLA

1

你可以实例化你的对象的动态。

MyObject* objPtr = new MyObject; 

但是不要忘了,当你将不再有

delete objPtr; 
+1

你必须小心删除'objPtr',因为它会使存储在地图中的指针无效。 – MKroehnert

+0

你是对的,这对我来说很自然。 – Masadow

4

代码线

MyObject obj1; 

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

您基本上有以下选项:

  • 创建于,而不是本地的对象。这是通过使用new关键字完成的。但是,你必须在某个时间点对delete这个对象。

    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

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

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

    引用的行为类似于指针(某些情况下即他们只“点”),但也有一些差异。例如,引用始终指向其整个生命周期中的相同实例(不能重新分配引用)。而且,它们的语法等于值,即不需要->

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

+0

使用'shared_ptr'的值为+1,但是您能否指出这只适用于最新的标准? – MKroehnert

+1

@MKroehnert谢谢,我添加了一条评论。 – leemes

+0

非常感谢你leemes,只是存储对象而不是指针来解决所有问题......并且你的解释非常有用 – JLA