c ++:访问父类的成员

时间:2015-12-15 02:54:36

标签: c++ templates

我有这个基础和这些派生类

class AlarmType
{
    public:
        unsigned int alarmIndex;
};

class TrendAlarmType : public AlarmType
{
    public:
        typedef enum 
        {
            decreasing = 0, //will be used as index apart from enum
            steady,
            increasing
        } Trend_types;

        Trend_types alarmIndex2;
};

class ThresholdAlarmType : public AlarmType
{
    public:
        typedef enum 
        { 
            low = 0, //will be used as index apart from enum
            lowmid,
            highmid,
            high,
        } Threshold_types;

        Threshold_types alarmIndex3;
};  

此处alarmIndex2alarmIndex3的类型不同,因此AlarmType::alarmIndex不应存在。 是否可以声明模板 理想情况下,alarmIndex将是基类的模板成员,alarmIndex2 & 3将不存在。可能吗?我正在尝试将AlarmType实现为模板类

template< typename T>
class AlarmType
{
    public:
        unsigned int alarmIndex;
};

然后尝试从派生类中访问alarmIndex,如下所示

alarmIndex<Trend_types> = tt;  OR
alarmIndex<Threshold_types> = tt;

我收到大量错误,首先出现“错误:行'{'token'之前的预期类名

class TrendAlarmType : public AlarmType
{ ...

如果我尝试添加我想要的类型

class TrendAlarmType : public AlarmType<Trend_types>
{ ...

Trend_types尚未宣布。所以我遇到了其他麻烦。有没有办法在基类中声明变量?

谢谢

1 个答案:

答案 0 :(得分:1)

我不是100%清楚你要完成什么,但我相信你所寻找的不是继承,而是模板别名,这是在C ++ 11(C ++ 11-)中引入的支持编译器是必需的):

typedef enum
        {
        decreasing = 0, //will be used as index apart from enum
        steady,
        increasing
        } Trend_types;

typedef enum
        {
        low = 0, //will be used as index apart from enum
        lowmid,
        highmid,
        high,
        } Threshold_types;    

template<typename T> using alarmIndex=T;

这使得可以使用以下语法:

alarmIndex<Trend_types> t1 = decreasing;
alarmIndex<Threshold_types> t2 = lowmid;

根据你的问题,这似乎是你想要实现的语法。

但是让我们更进一步,并使用枚举类强制执行类型安全:

enum class Trend_types
{
    decreasing = 0, //will be used as index apart from enum
    steady,
    increasing
};

enum class Threshold_types
{
    low = 0, //will be used as index apart from enum
    lowmid,
    highmid,
    high,
};

template<typename T> using alarmIndex=T;

// ...

alarmIndex<Trend_types> t1 = Trend_types::decreasing;
alarmIndex<Threshold_types> t2 = Threshold_types::lowmid;

使用枚举类,编译器将强制执行类型安全,并拒绝尝试将Threshold_types值分配给Trend_types实例(自己尝试)。

请注意,模板别名是通用的,并且会为任何类提供此语法糖,而不仅仅是这两个。

如果您真的想要,可以通过更多工作限制模板别名仅适用于这两个类。