2011-12-08 17 views
0

我有一個自定義類作爲地圖中的一個鍵。當我嘗試將一個項目插入地圖時,程序終止。密鑰的創建必須有一個問題。帶定製密鑰的C++地圖插入失敗

class MyKey { 
    char* data; 
    bool operator<(const MyKey& s) const { 
     for(int i = 0; i < (int)(sizeof(data)/sizeof(char)); i++) { 
      if(data[i] > s.data[i]) 
      return false; 
     } 
     return true; 
    } 
} 

map<MyKey, char>* map = new map<MyKey, char>; 
MyKey* key = new MyKey(...); 
map->insert(make_pair(*key, '0')); 

該程序終止在插入。

+1

你可以發佈<()'的myKey的'執行::運營商和MyKey'的'定義(需要看到成員變量和複製構造函數和賦值運算符)。 – hmjd

+0

我在密鑰類中添加了一些信息 – dbrettschneider

+3

你在MyKey中有拷貝構造函數嗎?什麼是實現? – Shawnone

回答

4

如果您正在試圖在operator<函數的for循環中嘗試執行,您無法單獨從指針確定數組的大小......您必須在某個時間通過由data指向的數組的大小,以便您不會溢出數組data指向的數組的邊界。由於data是一個指針,因此sizeof(data)只是返回平臺上指針的大小,而不是指向data指向的數組的大小。

對於C++,而不是使用分配的數組,你應該possibily使用STL容器,你可以直接查詢容器對象的大小...這可能包括std::string如果是字符串數據,或者std::vector<unsigned char>如果它是隻是一堆二進制字節。

0

從您的示例代碼中,不會調用運算符<,因爲您只在地圖中插入一個元素。而你說過你沒有實現一個拷貝構造函數。所以,下面的代碼將是一個問題:

class MyKey { 
public: 
    MyKey() 
    { 
     data = new char[10]; 
    } 
    ~MyKey() 
    { 
     delete data; 
    } 

private: 
    char* data; 
}; 
0

以下作品和印刷品A.

#include <iostream> 
    #include <map> 
    using namespace std; 

    class Key 
    { 
    public: 
     Key(int x):data(x) {} 
     bool operator<(const Key &k) const { return(data < k.data); } 
    private: 
     int data; 
    }; 

    int main() 
    { 
     Key myKey(10); 
     map<Key, char> m; 
     m.insert(make_pair(myKey, 'A')); 
     map<Key, char>::iterator it = m.find(myKey); 
     if (it != m.end()) 
     { 
      cout << (*it).second << endl; 
     } 
    }