Создание оператора индексатора класса [], разрешающего строковый параметр (строковый индекс) - PullRequest
4 голосов
/ 28 ноября 2010

Я хочу создать класс в 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 * в качестве параметра ... ничего.

Может кто-нибудь сказать мне, как достичь такого результата в c ++ наилучшим образом?Я полагаю, что это общая проблема для индексации по строке, а не по целому числу ... Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2010

Код, который вы предоставили, должен скомпилироваться нормально (при условии, что 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 голос
/ 28 ноября 2010

Должно работать нормально. Посмотрите этот пример, который компилируется и работает нормально для меня:

#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.

Форма () разрешена в некоторых других контекстах инициализации (5.3.4, 5.2.3, 12.6.2). - конец примечания]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...