1

以下は機能しません:

std::vector<IRule*> vec;
RuleRangeDouble *rule = new RuleRangeDouble(0, 100);
vec.push_back(rule);

では、さまざまなルールのベクトルをどのように作成できるでしょうか。ポインターを使用する必要があることはわかっています...しかし、これを機能させるには他に何をしなければなりませんか? この作業を行うために基本構造を変更するにはどうすればよいですか?

次のようなインターフェイスを使用します。

// Interface
    template <typename T>
    class IRule
    {
        public:
            virtual bool isValid(T value) = 0;
    };

そして、私の例のクラスは次のようになります。

class RuleRangeDouble : public IRule<double>
    {
        private:
            double min;
            double max;
        public:

            bool isValid(double value)
            {
....
            };
    };
4

2 に答える 2

3

The vector needs to be a vector of an actual type, for example std::vector<IRule<double>*>. Irule on its own is not a type, it is a class template. So you would need

std::vector<IRule<double>*> vec;
RuleRangeDouble *rule = new RuleRangeDouble(0, 100);
vec.push_back(rule);

If the template parameter is not part of the interface, you can introduce a common base class. Don't forget to give it a virtual destructor:

class IRule
{
    public:
        virtual bool isValid(T value) = 0;
        virtual ~IRule() {}
};

template <typename T>
class Rule : public IRule 
{
  .....
};

class RuleRangeDouble : public Rule<double>
{
  ....
};

Then your original use case sample would work:

std::vector<IRule*> vec; // IRule really is a type now
RuleRangeDouble *rule = new RuleRangeDouble(0, 100);
vec.push_back(rule);
于 2013-07-11T08:03:54.087 に答える