0

私の主なクラスは次のとおりです。

class Data{
public:
    Data(std::string name):name_(name){};
    virtual ~Data(){};

protected:
    std::string name_;
};

あらゆる種類のデータを許可したいので、テンプレートを使用して継承されたクラスを作成します。

template<typename Type>
class GenericData : public Data{
 public:
    GenericData(std::string name, Type t);

private:
    Type t_;
};

template<typename Type>
GenericData<Type>::GenericData(std::string name, Type t):
    Data(name),
    t_(t)
{}

3 番目のクラスは (Generic)Data のコレクションです。

class Input{
public:
    Input();
    ~Input();

private:
    std::vector<Data*> d_;
};

Input::Input(){
    d_.push_back(new GenericData("double",3.2);
    d_.push_back(new GenericData("int",2);
}

Input::~Input(){
    for(unsigned int i(0);i<d_.size();i++){
    delete d_[i];
    d_[i] = NULL;
    }
}

どうすればよいかわからないのは、クラスt_から値を取得することです。Inputtemplata<typename Type> Type Input::get(unsigned int i)返すメソッドが欲しいt_です。で仮想メソッドを作成しData、別のメソッドを作成する必要があると思いますが、機能さGenericDataせることができません。

4

2 に答える 2

2

それはとても簡単です:

#include <string>
#include <vector>
#include <iostream>

class Data{
public:
    Data(std::string name):name_(name){};
    virtual ~Data(){};

protected:
    std::string name_;
};

template<typename Type>
class GenericData : public Data{
 public:
    GenericData(std::string name, Type t);

    Type Get() { return t_; }
private:
    Type t_;
};

template<typename Type>
GenericData<Type>::GenericData(std::string name, Type t):
    Data(name),
    t_(t)
{}

class Input{
public:
    Input() {}
    ~Input();

    void Add(Data*v) {d_.push_back(v);}
    template<typename T>
    T Get(int i) {
        return dynamic_cast< GenericData<T> *>(d_[i])->Get();
    }
private:
    std::vector<Data*> d_;
};

Input::~Input(){
    for(unsigned int i(0);i<d_.size();i++){
    delete d_[i];
    d_[i] = NULL;
    }
}

int main() {
        Input inp;
        inp.Add(new GenericData<int>("1", 1));
        inp.Add(new GenericData<double>("2", 2.0));
        std::cout << "1: " << inp.Get<int>(0) << "; 2: " << inp.Get<double>(1) << std::endl;
        return 0;
}
于 2013-10-17T09:31:40.737 に答える
1

それはかなり問題です。まず、データから取得する方法を提供する必要があります。たとえば、次のようになります。

(inside GenericData)

public:
    T GetValue()
    {
        // Consider naming t_ more informative
        return t_;
    }

次に、Input でデータを取得するための汎用メソッドを作成できます。

(inside Input)

public:
    template <typename T>
    GenericData<T> * GetData(int index)
    {
        return dynamic_cast<GenericData<T> *>(_d[index]);
    }

または、より簡単に:

(inside Input)

public:
    template <typename T>
    T GetValue(int index)
    {
        return (dynamic_cast<GenericData<T> *>(_d[index]))->GetValue();
    }
于 2013-10-17T09:35:42.373 に答える