sizeof派生自base

时间:2010-04-29 08:52:52

标签: c++ sizeof

是否可以从基类/ struct返回 sizeof 派生类?

一个班级的大小是一种自身的属性,就像人类的重量一样。但我不想在每个班级都写相同的功能。

非常感谢提前祝贺 哎呀 PS:代码让我的问题更清晰:

template <typename T>
struct StructBase {
    size_t size<T>(){
        return sizeof(T);
    }
};

struct MyStruct: public StructBase<MyStruct> {
    double d1;
    double d2;
    double d3;
    MyStruct(): d1(0), d2(0), d3(0){}
    //I do not want to do this here
    //size_t size(){ //return size<MyStruct> ;}
};

int main(void) {
   MyStruct m;
   std::cout << m.size(); //nop ?!?
}

4 个答案:

答案 0 :(得分:2)

由于基类不应该知道从它们派生的类(这将创建循环依赖),因此基类方法甚至无法知道哪些额外字段已添加到派生类。而且,sizeof不能是多态的 - 它只适用于静态类型和结构。因此,尝试像sizeof(*this)这样的东西是没有意义的。

所以它不起作用。

更新:好吧,现在这是一个完全不同的问题。使用模板,这甚至可以用于FWIW(我没有IDE来试用它)。但请注意,现在你几乎拥有一个带有类型参数的模板函数,该函数可以是任何东西 - 仅限于你,程序员。总的来说,我没有看到你用这个解决方案实际赢得了什么 - 这可能是由于缺乏背景。

答案 1 :(得分:1)

您不能重载size​​of运算符。而且我不确定你在问什么:

class A {
   int x, y;
};

然后:

size_t n = sizeof( A );

给出了A类的大小 - 我没有看到派生的位置。

编辑,关于您的扩展问题,我不明白为什么您不能说:

MyStruct m;
std::cout << sizeof( m );

请注意,尺寸不是像重量这样的属性 - 重量可以改变,并且对于不同的实例是不同的。编译时编译器必须知道类的大小,并且不能更改。

答案 2 :(得分:1)

class A {
  int a;
}

class B : A {
 int b;
}

B(2xint)的大小是A(1xint)大小的两倍,sizeof不是指对象而是指类型。我知道你想做什么,但多态只适用于对象,而不是类型。因此,如果你做sizeof(A)并期望它返回B的大小,请三思而后行,处理器无法知道你想要B的大小而不是A,因为它们是不同的; - )

答案 3 :(得分:0)

以下是如何完成此操作的示例:

template <typename T> 
struct StructBase { 
    unsigned int const size;
    StructBase<T>():size(sizeof(T)) { }
}; 

struct MyStruct: public StructBase<MyStruct> { 
    double d1; 
    double d2; 
    double d3; 
    MyStruct(): d1(0), d2(0), d3(0){} 
    //I do not want to do this here 
    //size_t size(){ //return size<MyStruct> ;} 
};

确实很容易,但有一个缺点:从structBase派生的每个结构的大小都会有一个变量,并且根据其他变量,大小可能会显着增加:
在这个例子中,MyStruct的大小是24个字节,没有基类StructBase,但是基类是32个字节。这就是你可能不喜欢的东西。

问候 糟糕