如何建立一個只有其物件可以透過動態記憶體分配來分配的 C++ 類?
在本問題中,我們將瞭解如何建立一個類,以便我們只能透過動態記憶體分配來建立物件,不允許直接建立物件。
這個想法非常簡單。我們必須為該類建立一個私有解構函式。當解構函式為私有時,編譯器將為未動態分配的物件生成編譯器錯誤,因為編譯器需要在不再使用這些物件後將其從堆疊段中刪除。對於動態分配的物件來說,程式設計師負責刪除物件,而編譯器不負責刪除物件,因此它允許動態建立物件。
為了避免記憶體洩漏,我們將使用一個友元函式,它可以由類的使用者呼叫以銷燬物件。
舉例
讓我們看看以下實現以便更好地理解 −
#include<iostream>
using namespace std;
class NoDirectObjClass {
private:
~NoDirectObjClass() {
cout << "Destroyng NoDirectObjClass object" << endl;
}
public:
NoDirectObjClass() {
cout << "Creating object" << endl;
}
friend void friend_destructor(NoDirectObjClass* );
};
void friend_destructor(NoDirectObjClass* p) {
delete p;
cout << "Destroyng object using friend" << endl;
}
int main(){
NoDirectObjClass *p = new NoDirectObjClass;
friend_destructor(p);
}輸出
Creating object Destroyng NoDirectObjClass object Destroyng object using friend
如果我們嘗試直接建立物件,而不使用動態記憶體分配,那麼它將生成以下輸出 −
例項 (C++)
#include<iostream>
using namespace std;
class NoDirectObjClass {
private:
~NoDirectObjClass() {
cout << "Destroyng NoDirectObjClass object" << endl;
}
public:
NoDirectObjClass() {
cout << "Creating object" << endl;
}
friend void friend_destructor(NoDirectObjClass* );
};
void friend_destructor(NoDirectObjClass* p) {
delete p;
cout << "Destroyng object using friend" << endl;
}
int main(){
NoDirectObjClass t1;
}輸出
main.cpp: In function ‘int main()’:
main.cpp:22:22: error: ‘NoDirectObjClass::~NoDirectObjClass()’ is private
within this context
NoDirectObjClass t1;
^~
main.cpp:6:9: note: declared private here
~NoDirectObjClass() {
^
廣告
Data Structure
Networking
RDBMS
Operating System
Java
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP