2016-05-03 5 views
0

Ich habe eine Klasse X und Methode addX(), die Objekte von X auf dem Heap reserviert. Ich möchte den Client-Code davon abhalten, Objekte von X direkt zuzuweisen (so dass X *ptr = new X nicht erlaubt ist).Beschränken Client von Zuweisen von Objekten auf Heap C++

Ich habe new, new[] Betreiber private deklariert, aber da ich X's objects durch addX() bin Zuweisung muss ich sie (Betreiber) definieren. Wie sollte ihre Definition aussehen?

+0

Könnten Sie geben eine vollständigere (Pseudo-) Code-Beispiel von dem, was Sie versuchen, bitte zu erreichen. Außerdem sollten Sie sich mit Ihrem Anwendungsfall auseinandersetzen und warum Sie diese Einschränkung tatsächlich benötigen. –

+0

Ich entwickle ein Framework, das intern alle Objekte behandelt. der Benutzer muss nur addThis() oder removeThat() usw. aufrufen. – ibe

+0

@ibe Haben Sie in Betracht gezogen, die Erstellung komplett abzuschalten, indem Sie Konstruktor (und möglicherweise Destruktor) 'privat' machen und nur eine' public'-Memberfunktion bereitstellen, die Ihre Objekte erzeugt ? Wenn Sie steuern möchten, wie Ihre Objekte erstellt werden, wäre das die einfachste Sache, IMO. – PaulMcKenzie

Antwort

1

Das ist ziemlich einfach.

#include <iostream> 
#include <new> 

class X { 
public: 
    static void addX() 
    { 
     X* p1 = new X; 
     delete p1; 
    } 
private: 
    void* operator new(std::size_t sz) 
    { 
     std::cout << "custom new for size " << sz << '\n'; 
     return ::operator new(sz); 
    } 
    void* operator new[](std::size_t sz) 
    { 
     return ::operator new(sz); 
    } 
}; 

int main() 
{ 
    X::addX(); 
} 
1

die Konstrukteure verbergen, verwenden Sie eine Fabrik-Funktion:

class A 
{ 
public: 
    static A* create() { return new A; } 
    static void destroy(A* a) { delete a; } 
protected: 
    A() {} 
    A(const A&) {} 
    A& operator=(const A&) {} 
};