1

我有两节课:

  1. 价值范围
  2. 菜单项

第三个类 Menu 使用 MenuItem 类来定义几个菜单项,每个菜单项都有一个值范围(整数、浮点数、布尔值)。

我所做的是:

template <class T>
class ValueRange{
    private:
        T minValue;
        T maxValue;         
    public:
        void setMinValue(T minValue){this->minValue=minValue;};
        void setMaxValue(T maxValue){this->maxValue=maxValue;};
        ValueRange(){};
        ~ValueRange(){};
};

#include <string>
#include "ValueRange.hh"
class MenuItem{
    private:
      std::string name;
      /*
       * does not compile...
       * error: invalid use of template-name 'ValueRange' 
       * without an argument list
       * error: 'ValueRange' is not a type
       */
      ValueRange value;
    public:
      /*
       * does not compile...
       * error: 'class MenuItem' has no member named 'value' 
       */
      void setValueRange(ValueRange value){this->value=value;}
      MenuItem(){};
      ~MenuItem(){};
};

我如何实现其属性值是通用的类 MenuItem,以便我可以让 menuItems 具有整数、浮点数、布尔值等的值范围?

4

2 回答 2

3

C++ 中的类模板需要实例化。例如:

ValueRange<int>

是一个有效的类型。

ValueRange

没有类型不是。

要实现一个通用的 MenuItem,你可以让 MenuItem 成为一个模板类,或者你可以让你的 ValueRange 扩展一个非模板基类,例如:

class ValueRangeBase { /* some virtual members here... */ };

template <class T>
class ValueRange : public ValueRangeBase { /* same as before */ };

然后,您可以使用 ValueRangeBase(虽然不是按值)作为通用 ValueRange。这有时很有用,但可能不是您想要的。

于 2013-06-23T15:10:22.200 回答
2

只需参数化MenuItemValueRange

template<class T>
class MenuItem
{
   ...
   ValueRange<T> value;
   ...
   void setValueRange(ValueRange<T> value) { ... }
   ...
};
于 2013-06-23T15:07:57.133 回答