2010-11-27 20 views
3

クラスのインデクサ演算子を作成する私は、C++でクラスを作成します。このクラスはコレクションで管理する必要があります。 OK、何の問題は、私はもちろん、[]演算子を使用したいだろうが、この場合には、私の願いは、インデックスのない位置ではありませんが、名前で==>という文字列インデクサーを使用することを意味します。[]許可の文字列パラメータ(文字列インデックス)

この種の何かが私のコンパイラにとても素敵ではないようだ。

// 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]]が存在しないので、彼はこの問題を解決することができないことを私に伝えます。 OK OK 私はこれを理解することができました... m ["Name"]を呼び出すことによって、コンパイラはそれを考えています。文字列ではなくchar *を受け入れる演算子を呼び出そうとしています... ok オペレータ[] char *をパラメータとして使うことはできません。

は、誰かがどのようにベストプラクティスのようにC++でこのような結果を達成するために教えてもらえますか?私は ありがとうございました...それは文字列ではなく整数によってインデックスに共通する問題であると仮定します。

+0

あなたは 'のstd ::文字列値= mの[STD ::文字列( "名前")]しようとすると何が起こるか;' – SingleNegationElimination

+4

を、私は、コンパイラは彼女が – Inverse

+0

を*であるかなり確信しています@ TokenMacGuy、std :: stringにはchar *を取るctorがあるので、それは問題ではありません。 – Johnsyweb

答えて

1

正常に動作するはずです。コンパイルし、私のために[OK]を動作します。この例を参照してください:

#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();

は、クラスXのオブジェクトの宣言ではなく、関数の宣言は、引数を取らないとX.

フォームを返す()5.2、5.3.4(特定の他の初期化コンテキストで許可されています3、12.6.2)。 - エンドノート]

+0

それは本当に変です...エラーは次のようになります: "無効な型mynamespace :: myclass()[const char [5]]配列添字" ...私の神何を意味するのですか? "この文章 "myclass()[const char [5]]"は奇妙です...それは何を参照していますか?私の1つは、public演算子[]がstd :: stringを返し、const std :: string&asパラメータをとる通常のクラスです...この演算子を使ってこの演算子を使用すると、 :myclassinstance ["value"]。その行をコンパイルしてコメントすると、すべてのクラスがコンパイルされます。 – Andry

+2

int main()には何かこのようなものが含まれていますか? MyClass obj();そのようにして、記述した「配列添え字の無効な型」エラーが発生します。 – Palmik

+0

私は信じることができません...何かに気づいていないので、とてもシンプルです....よくPlamikあなたの天才、どのようにそれを推測することができます???????どうもありがとう.... :) – Andry

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"); 
} 
+0

助けてくれてありがとう...地図を使っていいアイデアだと思います...それについて考えてみましょう。 :) – Andry

関連する問題