C++ C&x2B的尺寸+;从静态成员函数初始化

C++ C&x2B的尺寸+;从静态成员函数初始化,c++,class,inheritance,sizeof,member,C++,Class,Inheritance,Sizeof,Member,我试图编写一个C++代码,它从静态类成员中分配一个类的实例,同时知道任何继承的子类的大小 .h文件 class MyObject { int toastNumber; static MyObject *allocate(); } class MySubclass : public MyObject { int NSABackdoor; int someOldFunction(); } .cpp文件 #include ".h file" MyObject *My

我试图编写一个C++代码,它从静态类成员中分配一个类的实例,同时知道任何继承的子类的大小

.h文件

class MyObject {
    int toastNumber;
    static MyObject *allocate();
}
class MySubclass : public MyObject {
    int NSABackdoor;
    int someOldFunction();
}
.cpp文件

#include ".h file"

MyObject *MyObject::allocate() {
    return (MyObject *)calloc(1, sizeof(this)); // error here
}

int MySubclass::someOldFunction() {
    return 6;
}
main.cpp文件

#include other files
int main() {
    MySubclass *instance = MySubclass::allocate();
    return 0;
}
在试图编译代码时,g++会抛出如下错误

MyObject.cpp: In static member function ‘static MyObject* MyObject::allocate()’:
MyObject.cpp:5:47: error: ‘this’ is unavailable for static member functions
可以像这样从成员函数内部分配实例吗? 我不能只使用sizeof(MyObject),因为这会破坏继承。 我知道这可以用宏来完成,但我更喜欢它作为类函数

谢谢

--


凯兰

错误信息非常清楚。静态成员函数不属于任何特定对象,只能访问类的静态数据成员。这就是为什么不需要类实例来调用静态成员函数的原因

你可以试试-

MyObject *MyObject::allocate() {
    return new MyObject();
}

请记住删除资源。

错误消息非常清楚。静态成员函数不属于任何特定对象,只能访问类的静态数据成员。这就是为什么不需要类实例来调用静态成员函数的原因

你可以试试-

MyObject *MyObject::allocate() {
    return new MyObject();
}

请记住删除资源。

首先,您不应该使用calloc,而应该使用new
其次,可以使用sizeof(MyObject)

第三,即使这是可用的,sizeof(this)是指向对象的指针的大小,而不是对象本身 其次,可以使用sizeof(MyObject)

第三,即使这是可行的,sizeof(this)是指向对象的指针的大小,而不是对象本身

如果您坚持这样做,您应该使用模板,如下所示

template <class SubClass>
static SubClass* allocate();

template <class SubClass>
SubClass *MyObject::allocate() {
    return (SubClass *)calloc(1, sizeof(SubClass));
    //or return new SubClass();  // this is better and is the C++ way
}

< >你的代码不起作用,因为C++没有“自类型”< /p> 的概念。如果你坚持这样做,你应该使用模板,如下面的。
template <class SubClass>
static SubClass* allocate();

template <class SubClass>
SubClass *MyObject::allocate() {
    return (SubClass *)calloc(1, sizeof(SubClass));
    //or return new SubClass();  // this is better and is the C++ way
}

<>你的代码不起作用因为C++没有“自我类型”的概念

看起来你要做的是重写<代码>运算符new <代码> < <代码> MyClass <代码>及其派生类:

class MyObject {
    int toastNumber;
    static void* operator new(std::size_t size) {
        void* ptr = ::operator new(size);
        std::cout << "Allocated " << size << " bytes at address "
                  << ptr << '\n';
        return ptr;
    }
};
类MyObject{
整数toastNumber;
静态void*运算符新(std::size\u t size){
void*ptr=::运算符新(大小);

std::cout看起来您要做的是为
MyClass
及其派生类重写
operator new

class MyObject {
    int toastNumber;
    static void* operator new(std::size_t size) {
        void* ptr = ::operator new(size);
        std::cout << "Allocated " << size << " bytes at address "
                  << ptr << '\n';
        return ptr;
    }
};
类MyObject{
整数toastNumber;
静态void*运算符新(std::size\u t size){
void*ptr=::运算符新(大小);


STD::CUT在C++中不使用CaloC(使用new),在静态成员函数中不能使用<代码>这个<代码>,这是没有意义的。<代码> sieZof(MyObjor)将工作。@博格雷德,他试图从代码中获得类名。这个< /Cord>不是一个对象。但是,是的,因为C++不支持这个。所以,你是不是偶然混淆了<代码>静态< /代码> >代码>虚拟< /代码>?不要在C++中使用CaloC(使用新的)您不能在静态成员函数中使用
这个
,它没有任何意义。
sizeof(MyObject)将工作。@博格雷德,他试图从代码中获得类名。这个< /Cord>不是一个对象。但是,是不工作的,因为C++不支持这个。你是不是偶然混淆了<代码>静态< /代码> > <代码>虚拟<代码>?C++方式根本不使用<代码>新< />代码。这是不必要的复杂,它使用CaloCc。他是唯一真正理解这个问题的人。--等等,别担心,这不是我想的解决办法was@Borgleader仔细阅读这个问题,也许你会发现问题复杂的原因,对于
calloc
,我通常会先解决问题,然后再提出进一步的建议(在下一行)别介意,我没脑子。我正在考虑从模板函数返回基类指针。如果你试图用一个不是子类的类调用它,那么就会出错。但是我想这取决于你想把错误捕获到哪里。C++方式根本就不使用<代码>新< /C>。这是不必要的。这是唯一一个真正理解这个问题的人。--等等,没关系,这不是我想的解决方案was@Borgleader仔细阅读这个问题,也许你会发现问题复杂的原因,对于
calloc
,我通常会先解决问题,然后再提出进一步的建议(在下一行)Nevermind我的Nevermind。我一直在思考如何从模板函数返回基类指针。这样,如果您尝试使用非子类的类调用它,就会出现错误。但我想这取决于您希望捕获错误的位置。您的代码可以工作,并且似乎可以识别子类。谢谢。如果我也可以的话请问,有没有一种方法可以
subclass*i=subclass::allocate()
而不强制转换到subclass?As::allocate返回一个MyObject。@KaelanDuck:你说它“子类感知”是什么意思?它将分配一个
MyObject
对象,无论从哪个类调用它。这不是子类aware@BenjaminLindley我的意思是,我可以访问子类的所有成员,即使我似乎正在分配一个MyObject@KaelanDuck:我不知道您使用了什么代码来确定这一点,但它是错误的。您的代码可以正常工作,而且似乎是正确的子类感知。谢谢。如果我也可以问一下,有没有办法不强制转换到子类而
subclass*I=subclass::allocate()
?As::allocate返回一个MyObject。@KaelanDuck:你说它是“子类感知”是什么意思?它将分配一个
MyObject
对象,无论从哪个类调用它。这不是子类aware@BenjaminLindley我的意思是,我可以访问子类的所有成员,即使我似乎正在分配一个MyObject@KaelanDuck:我不知道您使用了什么代码来确定,但它是错误的。