Класс C ++: как использовать dict ["hello"] = 20;как питон - PullRequest
0 голосов
/ 20 мая 2018

Я впервые задаю вопрос о переполнении стека.

В названии я хочу сделать простой словарь.

Вот мой код C ++:

class Dict
{
public:
    Dict(string key, int value);
    ~Dict();
    void append(string key, int value);
    int operator[](string search);
    //int operator=(int value);

private:

    string* keys;
    int have_keys;
    int* values;
};

Методы:

Dict::Dict(string key, int value)
{
    keys = new string[1];
    keys[0] = key;
    have_keys = 1;
    values = new int[1];
    values[0] = value;
}

//append a key an a value
void Dict::append(string key, int value)
{
    string* temp_keys = new string[have_keys+1];
    memcpy(temp_keys, keys, sizeof(string)*have_keys);
    temp_keys[have_keys] = key;

    int* temp_values = new int[have_keys+1];
    memcpy(temp_values, values, sizeof(int)*have_keys);
    temp_values[have_keys] = value;

    have_keys++;

    keys = new string[have_keys];
    memcpy(keys, temp_keys, sizeof(string)*have_keys);
    delete[]temp_keys;

    values = new int[have_keys];
    memcpy(values, temp_values, sizeof(int)*have_keys);
    delete[]temp_values;
}

//a = dict["hello"];
int Dict::operator[](string search)
{
    for(int i = 0;i<have_keys;i++){
        if(keys[i]==search){
            return values[i];
        }
    }
}

Я мог бы сделать это:

Dict dict = Dict("hello", 10);
int a = dict["hello"];
show(a);

Однако, для ...

dict["hello"]=20;

Как я могу перегрузить операторы, чтобы сделать это?

Я не хочу этого: dict.set ("привет", 20);

Спасибо!

1 Ответ

0 голосов
/ 20 мая 2018
int& Dict::operator[](string search)
{
    for(int i = 0;i<have_keys;i++){
        if(keys[i]==search){
            return values[i];
        }
    }
    // throw here...


}

Возвращает ссылку на int, и вы можете присвоить ей значение в main, используя

dict["hello"] = 45;

Помните, что если Ключ не указан на карте, то есть UB

...