为字典cpp创建[] =运算符

时间:2018-07-23 11:36:08

标签: c++ templates operator-overloading operators

我正在尝试清除字典并做到这一点:

Dict d;
d.set("Home",34);
d["Home"] =56;

但是我不断出错(我无法理解左值和右值的东西)。 但由于出现左值问题,我不断收到无法执行“ d [” House“] = 56”行的错误。我也尝试覆盖运算符'=',但对我来说不起作用。

这是我的班级头文件:

#include <iostream>
#include <vector>
using namespace std;

template <class K, class V>
class Dict {
protected:
    vector<K> keys;
    vector<V> values;
    K Key;
    V Value;
public:
    Dict();
    Dict(K Key, V Value);
    void set(K Key, V Value);
    void print();
    V operator[](K* str);
    const V& operator[](K &str);
    Dict<K,V>& operator==(const Dict<K,V> dict);
};
template class Dict<string, int>;

这是我的cpp文件:

#include "Dict.h"
template <class K, class V>
Dict<K,V>::Dict() {};

template <class K, class V>
Dict<K,V>::Dict(K Key, V Value) :
        Key(Key), Value(Value){};

template <typename K, typename  V>
void Dict<K,V>::set(K Key, V Value) {
    keys.push_back(Key);
    values.push_back(Value);
}


template <typename K, typename  V>
void Dict<K,V>::print() {
    cout << "{";
    for(int i = 0; i < this->keys.size(); i++){
        cout << "'" << this->keys[i] << "'" << "," << this->values[i];
        if(i == this->keys.size() - 1){
            cout << "}";
        }
        else{
            cout << " ,";
        }
    }
}


template <typename K, typename  V>
V Dict<K,V>::operator[](K* str) {
    V lol;
    for(int i = 0; i < this->keys.size(); i++){
        if(this->keys[i] == *str){
            return this->values[i];
        }
    }
    return lol;
}

template <typename K, typename  V>
<K,V>& Dict<K,V>::operator==(const Dict<K, V> dict) {
    *this = dict;
    return *this;
}

template <typename K, typename  V>
const V& Dict<K,V>::operator[](K &str) {
    V lol;
    for(int i = 0; i < this->keys.size(); i++){
        if(this->keys[i] == str){
            return this->values[i];
        }
    }
    return lol;
}

这是我的主要爱好:

#include "Dict.h"

int main() {
    Dict<string, int> d,t;
    d.set("Home",34);
    d.set("c",13);
    d.set("House",8);

    string str = "HOuse";
    string *str2 = &str;
    int i = d[str2];

    d[str2] == 56;
    d.print();

    return 0;
}

1 个答案:

答案 0 :(得分:5)

代替此

V operator[](K* str);

您应该拥有

V& operator[](K* str);
const V& operator[](K* str) const;

您的运算符正在按值返回,因此他返回的是一个临时副本,因此将对该副本进行修改

和第二个允许在类的常量对象上读取的运算符