将类接口转换为类模板

时间:2015-11-14 15:04:07

标签: c++

我在没有备忘录的情况下完成了一些旧的试卷。我只是想确保我正确理解这一点。

  

提供模板类的接口

Dictionary <Tkey, TValue>

这是提供的方案

class Dictionary {
    public:
        Dictionary();
        void Add(int key, const string &value);
        string Find (int key) const;
    private:
        vector<int> Keys;
        vector <string> Values;
};

这是我写下的解决方案

class Dictionary {
    public:
        Dictionary();
        void Add(TKey key, const TValue &value);
        TValue Find (TKey key) const;
    private:
        vector <Dictionary> Keys;
        vector <Dictionary> Values;
};

这对我来说是正确的。我还没有为此编译驱动程序,因为我只想确保在模板类中正确理解这一点。

我认为只涉及向量的最后两行是我想确保我写得正确的。

感谢您抽出宝贵时间。

2 个答案:

答案 0 :(得分:1)

您应该按照说明操作:

template<typename Tkey, typename TValue> // <<<<<<<<
class Dictionary {
public:
    Dictionary();
    void Add(TKey key, const TValue &value);
    TValue Find (TKey key) const;
private:
    vector <TKey> Keys; // <<<<<<<<
    vector <TValue> Values; // <<<<<<<
};

甚至更好(因为很难将这些矢量成员恰当地联系起来):

template<typename Tkey, typename TValue> // <<<<<<<<
class Dictionary {
public:
    Dictionary();
    void Add(TKey key, const TValue &value);
    TValue Find (TKey key) const;
private:
    vector <std::pair<TKey,TValue>> dict; // <<<<<<<
};

答案 1 :(得分:1)

此转换不完整,略有不正确。

要使其完整,请确保该类实际上是一个类模板,即

template <typename TKey, typename TValue>
class Dictionary {
    ...
};

校正是使两个向量取值和值。目前,两个向量都设置为存储Dictionary元素,这不是您所需要的:第一个向量应该包含TKey元素,而第二个向量应该包含TValue个。一旦您开始实施Dictionary<TKey,TValue>::Find方法,您就会发现这个缺点。