C++ 在成员函数中创建对象

C++ 在成员函数中创建对象,c++,C++,标题的定义如下 class MyClass_A; typedef map<string, MyClass_A*> MyMap typedef vector<MyClass_A*> MyList class MyClass_A { // define some functions } class MyClass_B { public: void check(){ //create MyClass_A pointer to store in myMap

标题的定义如下

class MyClass_A;
typedef map<string, MyClass_A*> MyMap
typedef vector<MyClass_A*>      MyList

class MyClass_A
{
  // define some functions
}

class MyClass_B
{
public:
  void check(){ //create MyClass_A pointer to store in myMap and myList }
private:
  MyMap   myMap;
  MyList  myList;
}
我想在check中定义MyClass_A对象,它是MyClass_B中的一个成员函数。在主函数结束之前,这些对象不会被破坏


我尝试了一些方法,但是当离开check成员函数时,对象将被删除。有什么解决办法吗

使用智能指针,而不是存储原始指针:

class MyClass_B
{
public:
  void check(){
    //create MyClass_A pointer to store in myMap and myList
    Ptr_A obj = std::make_shared<MyClass_A>();
    myMap["hello"] = obj;
    myList.push_back(obj);
  }

private:
  typedef std::shared_ptr<MyClass_A> Ptr_A;
  std::map<std::string, Ptr_A> myMap;
  std::list<Ptr_A> myList;
}
class MyClass\u B
{
公众:
无效检查(){
//创建MyClass\一个指针以存储在myMap和myList中
Ptr_A obj=std::make_shared();
myMap[“hello”]=obj;
myList.push_back(obj);
}
私人:
typedef std::共享的ptr ptr A;
std::map myMap;
std::列表myList;
}

现在,
MyClass\u A
实例的生命周期被自动管理。当代码“> MyCaseBub/Cuth>的实例被破坏时,它所包含的对象也会被破坏。

当离开检查成员函数时,对象将被删除。据我所知,在C++中没有垃圾收集,如java中的(如果您从未引用它,则可能丢失实例)。至少,你能告诉我一些工作是做什么的,以及
void check()
是如何工作的。它可能会给你一些启示。你应该用<代码>新< /Cord>创建这些对象,这样当你离开函数<代码> MyCaseB::Cuffor(<…)>代码时,它们不会死亡。……C++的名字<代码>以下划线开头的名称不得使用第二个下划线或大写字母作为其第二个字符。函数执行完成后,
check
函数中声明的对象将立即销毁。要执行您试图执行的操作,您需要在
check
函数之外声明该对象。@A.S.H:它可以工作!谢谢,谢谢你的回复。是否可以将MyClass_声明为检查函数内部或外部指向此问题的指针?@ycliu:我不知道你现在在问什么。只需使用
map
而不是
map
。使用
MyClass_A*tmp=newmyclass_A
@ycliu可以解决这个问题:您可以这样做,但是您需要非常小心,不要泄漏内存。
class MyClass_B
{
public:
  void check(){
    //create MyClass_A pointer to store in myMap and myList
    Ptr_A obj = std::make_shared<MyClass_A>();
    myMap["hello"] = obj;
    myList.push_back(obj);
  }

private:
  typedef std::shared_ptr<MyClass_A> Ptr_A;
  std::map<std::string, Ptr_A> myMap;
  std::list<Ptr_A> myList;
}