1

我正在尝试编写一段 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) 因为那会破坏继承。我知道这可以用宏来完成,但我更喜欢它作为类函数。

谢谢

--

凯兰

4

4 回答 4

1

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

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
}

请注意,使用calloc可能会导致进一步的问题,首先是它不会调用构造函数。

我还假设您的意思是malloc,因为calloc似乎是针对数组的。

然后你会称它为

MySubclass *instance = MyObject::allocate<MySubclass>();

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

于 2013-08-11T02:38:40.193 回答
0

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

你可以试试 -

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

并记得删除资源。

于 2013-08-11T02:27:55.873 回答
0

首先,您不应该使用 calloc,而应该使用 new
其次,您可以使用 sizeof(MyObject)
第三,即使 this 可用,sizeof(this) 是指向对象的指针的大小,而不是对象本身

于 2013-08-11T02:36:44.170 回答
0

看起来您想要做的是覆盖operator newMyClass派生类:

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;
    }
};

编译器传递正确大小的块来分配,具体取决于您是分配实际的MyClass还是更大的派生类。请注意,它并不像您想象的那么有用。

你想用这个做什么?

于 2013-08-11T03:49:24.767 回答