是否可以从基类/ 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 ?!?
}
答案 0 :(得分:2)
由于基类不应该知道从它们派生的类(这将创建循环依赖),因此基类方法甚至无法知道哪些额外字段已添加到派生类。而且,sizeof
不能是多态的 - 它只适用于静态类型和结构。因此,尝试像sizeof(*this)
这样的东西是没有意义的。
所以它不起作用。
更新:好吧,现在这是一个完全不同的问题。使用模板,这甚至可以用于FWIW(我没有IDE来试用它)。但请注意,现在你几乎拥有一个带有类型参数的模板函数,该函数可以是任何东西 - 仅限于你,程序员。总的来说,我没有看到你用这个解决方案实际赢得了什么 - 这可能是由于缺乏背景。
答案 1 :(得分:1)
您不能重载sizeof运算符。而且我不确定你在问什么:
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个字节。这就是你可能不喜欢的东西。
问候 糟糕