2010-11-27 53 views
3

我想在C++中創建一個類。這個班級必須管理一個集合。 好的,沒問題,我當然想使用operator [],但在這種情況下,我希望不是按位置索引,而是按名稱==>,這意味着使用字符串索引器。創建一個類索引運算符[]允許字符串參數(字符串索引)

看來,這種事情也不是那麼高興我的編譯器:

// In hpp 
class myclass { 
    ... 
    ... 
    std::string operator[](const std::string& name); 
} 
// In cpp 
std::string myclass::operator[](const std::string& name) { 
    ... 
} 
// In main 
myclass m; 
std::string value = m["Name"]; 

編譯器告訴我,他解決不了,是因爲運營商[爲const char [5]不存在。 好行 我可以想象這個...... 編譯器認爲通過調用m [「Name」]我試圖調用一個運算符承認char *而不是字符串...好吧 讓我們用運算符[]允許char *作爲參數...什麼都不是。

有人能告訴我如何以最佳實踐的方式在C++中實現這樣的結果嗎?我想這是通過字符串索引而不是整數索引的常見問題... 謝謝。

+0

當您嘗試'的std :: string值= M [的std :: string( 「名稱」)發生了什麼;` – SingleNegationElimination 2010-11-27 22:13:29

+4

我敢肯定,編譯器是* *她@ – Inverse 2010-11-27 22:57:32

+0

TokenMacGuy,std :: string有一個採用char *的ctor,所以這應該不重要。 – Johnsyweb 2010-11-28 01:03:05

回答

1

它應該工作正常。看到這個例子編譯併爲我的作品確定:

#include <iostream> 
#include <string> 

class MyClass 
{ 
    public: 
     std::string operator[] (const std::string& key) { std::cout << key << std::endl; return key; } 
}; 

int main() 
{ 
    MyClass obj; 
    std::string s = obj["50"]; 
    std::cout << s << std::endl; 
} 

而且我認爲沒有理由不應該,因爲的std :: string有隱式構造函數取const char*所以轉換應該是自動的。

編輯:從評論看來你的問題是與你的主要beeing這樣的:

int main() 
{ 
    MyClass obj(); 
    std::string s = obj["50"]; 
    std::cout << s << std::endl; 
} 

原因:

其初始化爲空括號的目的,即()應該進行值初始化。

[注:由於()不被語法初始化許可,

X A();

不是類X的對象的聲明,但)的函數的聲明不採取任何參數,並返回一個X.

的形式(在某些其它初始化上下文(5.3.4是允許的,5.2 .3,12.6.2)。 - 注完]

2

您提供的代碼應該可以編譯好(提供operatorpublic,並且用;終止您的class聲明)。我懷疑編譯器錯誤是在別的地方。

就我個人而言,我會使用std::map<std::string, std::string>作爲容器類。

#include <string> 
#include <map> 
#include <assert.h> 

int main() 
{ 
    std::map<std::string, std::string> m; 
    m["Foo"] = "Bar"; 
    m["Fez"] = "Baz"; 

    assert(m["Foo"] == "Bar"); 
    assert(m["Fez"] == "Baz"); 
}