在C ++中编写类行为

时间:2014-04-12 01:59:33

标签: c++ templates

我正在尝试开发某种类型的开发模式,以便以通用方式向类添加方法。几乎就像为类及其属性添加(行为)属性一样。

我希望添加方法,使用类 的内部数据,而不依赖于使用的变量名称

这样做的一种可能方法是从其他类扩展类,如下例所示:

template <class Self,class Type>
class AcessOperator {
    const Type* data;
public:
    AcessOperator(const Type * data) : data(data){}
    Type & operator [](int index){
        return data[index];
    }
};

class Vector1 : public AcessOperator<Vector1,int>{
    int * any;
public:
    Vector1() : AcessOperator<Vector1,int>(any),any(0){
        any = (int*)malloc(sizeof(int)*10);
    }

    virtual ~Vector1(){ free(any); }
};

我会为Vector1设置运算符[。]。

另一种达成目标的方法是使用宏:

#define access(class_type, pointer_name, index, return_type)\
return_type & operator[](int index){ \
    return pointer_name[index];\
}

class Vector2 {
    int * any;
public:
    Vector2() : any(0){
        any = (int*)malloc(sizeof(int)*10);
    }

    access(Vector2,any,index,int)

    virtual ~Vector2(){ free(any); }
};

我不喜欢宏,所以我更喜欢第一种方式。然而,这种方法导致数据方面的开销。我使用以下代码打印了每个班级的大小:

int main(){
    cout << sizeof(Vector1) << endl;
    cout << sizeof(Vector2) << endl;
    return 0;
}

这是输出:

sizeof(Vector1): 24
sizeof(Vector2): 16

这是预期的(我的机器是64位)

Vector1:2个指针+ vtable指针= 2 * 8 +8 = 24

Vector1:1指针+ vtable指针= 8 + 8 = 16

现在问题是:

如果没有使类更胖而不使用宏,是否有可能实现这一目标?

0 个答案:

没有答案