2012-06-06 35 views
6

我想创建一个静态映射在我的类的构造函数中声明。 这张地图将被初始化并用一种方法填充数据,并以另一种方法释放。 这是正确的方法吗?正确的方式来初始化一个映射并删除在C + +

using namespace std; 
#include <map> 

struct a { 
    string b; 
    string c; 
} 

class aClass:public myClass 
{ 
public: 
     aClass(); 
     virtual ~aClass(); 

private: 
     map<string, a> myMap; 
     void method(int a); 
     void amethod(int b); 
} 
void aClass::method(int a) 
{ 
     myMap = new map<string, a>; 
     // Addition of elements; 
} 
void aClass::amethod(int b) 
{ 
     // retrival of elements 
     myMap.clear(); 
     delete myMap; 
} 
+0

在你的代码中,'myMap'不是'static'。 “静态”是什么意思? –

+0

为什么你认为你需要新建一个地图并在以后删除它?只需按值保存地图,并在适当的时间调用clear()。 –

+0

我怀疑你的意思是包含[sli]标签。我编辑了你的文章,以包含[stl]标签。 –

回答

9
map<string, a> myMap; 
    .... 
    myMap = new map<string, a>; 

这里myMap不是指针,所以用new初始化不正确。也许你正在寻找:

myMap = map<string,a>(); 

复制到myMap一个默认初始化地图。

请注意,您不需要(并且实际上不能)delete myMap,因为它不是指针。它是一个成员变量,当你的类被销毁时,编译器会自动销毁它。

+0

我如何释放它? – snihalani

+0

@snihalani:你没有释放它,它不是一个指针......也许你想要的只是把'myMap'改成'map *'? –

+1

@snihalani你不释放它,当包含'aClass'被破坏时C++将释放它 – Motti

1
void aClass::method(int a) 
{ 
    myMap.clear(); // ensure it starts off empty 
    // Addition of elements; 
} 
void aClass::amethod(int b) 
{ 
    // retrival of elements 
    myMap.clear(); // maybe not necessary 
} 

目的myMap已经存在的aClass一个实例中及含有实例被构造时的构造。您不需要使用new来创建它,这是一个Java和C#功能,其中变量只是对堆上的某个实例的引用,并且所有内容都是垃圾收集的。在C++中,使数据成员成为值更容易,而不是指向其他对象的指针或引用。

相关问题