我想用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"];
编译器告诉我他无法解决这个问题,因为operator [const char [5]]不存在。 好的好的 我能算出来...... 编译器认为通过调用m [“Name”]我试图调用运算符来接受char *而不是字符串... ok 让我们用operator []更改代码,允许char *作为参数......没有。
有人能告诉我如何以最佳实践方式在c ++中实现这样的结果吗?我想这是一个常见的问题,按字符串索引,而不是整数... 谢谢。
答案 0 :(得分:2)
您提供的代码应该编译正常(假设operator
为public
,您使用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");
}
答案 1 :(得分: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*
所以转换应该是自动的。
编辑:从评论看来,你的主要问题似乎是你的问题:
int main()
{
MyClass obj();
std::string s = obj["50"];
std::cout << s << std::endl;
}
原因:
一个对象,其初始化程序是一组空的括号,即(),应进行值初始化。
[注意:初始化程序的语法
不允许使用()X a();
不是X类对象的声明,而是声明一个不带参数并返回X的函数。
在某些其他初始化上下文中允许使用form()(5.3.4,5.2.3,12.6.2)。 - 结束说明]