在下面的代码中,我没有得到
- 将 MyClass::~MyClass() 析构函数设为私有的用途/原因/好处?
- 由于析构函数是私有的,所以最后如何调用析构函数。
// myclass.h
#include <iostream>
class MyClass {
public:
static MyClass& GetInstance();
void Display();
private:
MyClass();
virtual ~MyClass();
};
MyClass::MyClass() {
std::cout << "Constructor " << std::endl;
}
MyClass::~MyClass() {
std::cout << "Destructor" << std::endl;
}
MyClass& MyClass::GetInstance() {
static MyClass _instance;
return _instance;
}
void MyClass::Display() {
std::cout << "Hello" << std::endl;
}
//主.cpp
#include "myclass.h"
#include <iostream>
int main() {
MyClass::GetInstance().Display(); //case1
std::cout << "main finished!" << std::endl;
return 0;
}
//输出
Constructor
Hello
Destructor
// Edit
如果我将 myclass 的构造函数公开并删除 GetInstance() 函数。
> MyClass obj;
> obj.Display();
然后弹出如下错误
1>e:\programs\cpp_test\src\main.cpp(38): error C2248: 'MyClass::MyClass' : cannot access private member declared in class 'MyClass'
1> e:\programs\cpp_test\static_single_test.h(11) : see declaration of 'MyClass::MyClass'
1> e:\programs\cpp_test\static_single_test.h(6) : see declaration of 'MyClass'
1>e:\programs\cpp_test\src\main.cpp(38): error C2248: 'MyClass::~MyClass' : cannot access private member declared in class 'MyClass'
1> e:\programs\cpp_test\static_single_test.h(12) : see declaration of 'MyClass::~MyClass
'
问题:
C++ 如何处理静态情况?是不是凌驾于私人行为之上?
在共享库的情况下,它可能会出现以限制应用程序可以执行的操作。
使用共享库的应用程序使用导出函数来获取对象的句柄,并且必须显式调用另一个导出函数来销毁该对象。
它就像一个有充分理由的使用合同 - 它存在于 DLL/so 的堆或数据段中 - 因此应用程序无法释放它)。
该导出的函数又会调用您的静态函数。就像是:
extern "C" __declspec(dllexport) MyClass* CreateMyClass() {
return &MyClass::GetInstance();
}
extern "C" __declspec(dllexport) void DestroyMyClass(MyClass* handle) {
delete handle; // assumes destructor isn't private.
// if destructor is private, you can't use delete since it calls the destructor, which is .... private!
handle->Destroy(); // A member function that calls the private destructor
}
MyClass::Destroy() {
if (it_is_safe_to_destroy_the_class)
~Destroy();
}
但是,那么 Destroy() 成员函数应该是公共的,所以这个例子还不够好(它是私有构造函数的一个很好的理由)
本质上,您希望限制您的类的用户可以通过私有构造和/或销毁来执行的操作。
您通过静态变量“创建”实例,而不是它们,并允许它们仅使用功能(公共接口)而不使用其他任何东西。
同样,当你认为它安全时,你就销毁它。
(编辑:我之前的回答主要针对私人建设,因此我添加了一个更明确的私人破坏示例)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)