2016-06-22 5 views
2

Ich möchte einen statischen, konstanten Zeiger auf ein Objekt des Klassentyps MyClass2 initialisieren, das in einem statischen Datenpuffer in der Klasse MyClass1 gespeichert ist, wenn dies der Fall ist instanziiert.Verwenden Sie Placement neu, um einen statischen Const-Zeiger auf einen statischen Speicherpuffer zu erstellen

funktioniert das nicht:

class MyClass1 { 
    public: 
     MyClass1() 
     { 
      _my_class_2_ptr = new (_my_class_2_buf) MyClass2(); 
     } 

    private: 
     static MyClass2 *const _my_class_2_ptr; 
     static char *_my_class_2_buf = new char[sizeof(MyClass2)]; 
}; 

Gibt es eine Möglichkeit, so etwas zu erreichen?

Antwort

4

Wenn Ihre Variablen statisch sind, können Sie sie nicht im Konstruktor initialisieren. Es macht einfach keinen Sinn! Was Sie wollen, ist, etwas zu tun wie

(im Kopfteil)

class MyClass1 { 
    // member  
    public: 
     static MyClass2 *const _my_class_2_ptr; 
     static std::aligned_storage_t<sizeof(MyClass2)> _my_class_2_buf; 
}; 

(CPP)

std::aligned_storage_t<sizeof(MyClass2)> MyClass1::_my_class_2_buf; 
MyClass2* const MyClass1::_my_class_2_ptr = new (&MyClass1::_my_class_2_buf) MyClass2; 
+0

Verstanden. Da der Klasse statische Variablen gemeinsam sind, ist es wahrscheinlich nicht sinnvoll, sie jedes Mal neu zu initialisieren, wenn die Klasse instanziiert wurde. In diesem Fall wollte ich jedoch, dass MyClass1 ein Singleton ist, so dass es nur einmal instanziiert werden kann, ich nehme an, dass es nicht wirklich wichtig wäre. – Bitrex

+0

Sie fehlen 'type' für std :: aligned_storage :: Typ - sehr schlecht! –

+0

@ DieterLücking er benutzt 'aligned_storage_t' nicht' aligned_storage' –

2

Sie können die Definitionen und intializations der static Membervariablen außerhalb der Klasse bewegen.

class MyClass1 { 
    public: 
     MyClass1() {} 

    private: 
     static MyClass2 *const _my_class_2_ptr; 
     static char *_my_class_2_buf; 
}; 

char *MyClass2::_my_class_2_buf = new char[sizeof(MyClass2)]; 
MyClass2 *const MyClass1::_my_class_2_ptr = new (_my_class_2_buf) MyClass2(); 
Verwandte Themen