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) を使用できます
第三に、これが利用可能であったとしても、sizeof(this) はオブジェクト自体ではなく、オブジェクトへのポインタのサイズです

于 2013-08-11T02:36:44.170 に答える