简体   繁体   English

C ++多态性:虚拟方法的返回类型

[英]c++ polymorphism : return type of a virtual method

My main class is : 我的主要课程是:

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

protected:
    std::string name_;
};

Since I'd like to allow any kind of data, I use a template to create my inherited class : 由于我想允许任何类型的数据,因此我使用模板创建继承的类:

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)
{}

The third class is a collection of (Generic)Data : 第三类是(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;
    }
}

The thing that I don't know how to do is to get the t_ value from from the Input class. 我不知道该怎么做的是从Input类获取t_值。 I'd like to have a templata<typename Type> Type Input::get(unsigned int i) method that returns t_ . 我想要一个返回t_templata<typename Type> Type Input::get(unsigned int i)方法。 I guess that I should create a virtual method in Data and another method in GenericData but I can't make it work. 我想我应该在Data创建一个虚拟方法,并在GenericData创建另一个方法,但是我无法使其工作。

It's pretty straightforward: 这很简单:

#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;
}

That's quite problematic. 那是很成问题的。 First of all, you have to provide some way to get it from Data, for example: 首先,您必须提供一些从数据中获取数据的方法,例如:

(inside GenericData)

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

Secondly, you can create a generic method for getting data in Input: 其次,您可以创建一个通用方法来获取Input中的数据:

(inside Input)

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

or, simpler: 或者,更简单:

(inside Input)

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM