在下面的代码中,我没有得到
// 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;
}
// main.cpp
#include "myclass.h"
#include <iostream>
int main() {
MyClass::GetInstance().Display(); //case1
std::cout << "main finished!" << std::endl;
return 0;
}
//输出
Constructor
Hello
Destructor
//编辑
如果我公开我的类的Contructor并删除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 ++处理静态大小写?是不是凌驾于私人行为?
答案 0 :(得分:2)
在共享库的情况下可能出现限制应用程序可以执行的操作。
使用共享库的应用程序使用导出的函数来获取对象的句柄,并且必须显式调用另一个导出的函数来销毁该对象。
它就像一个有充分理由的使用合同 - 它存在于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()成员函数应该是公共的,所以这个例子不够好(它是私有构造函数的一个很好的理由)
基本上,您希望通过私有构造和/或销毁限制您的类的用户可以执行的操作。 您通过静态变量“创建”实例,而不是它们,并允许它们仅使用功能(公共接口),而不是其他任何东西。 同样,当你认为安全时,你会销毁它。
(编辑:我之前的回答主要集中在私人建筑上,所以我为私人破坏添加了一个更明确的例子)
答案 1 :(得分:0)
类本身及其所有private
的所有成员函数(包括static
个)都可以访问friend
析构函数 。所以,显然,如果你只想要那些能够销毁一个对象,那么制作析构函数private
是可行的。
答案 2 :(得分:0)
您发布的类看起来像一个单例,这个类只允许每次执行一次实例化。构造函数和析构函数都是私有的,以确保您可以通过GetInstance调用访问对象实例的唯一方法,该调用以确保只存在一个实例的方式编写。
通过实现,实例是一个静态对象,这意味着当程序清理静态对象时它将被删除,基本上是在程序结束时。
What is the lifetime of a static variable in a C++ function?
答案 3 :(得分:-1)
是的,有理由在私有部分中创建析构函数。它将创建C ++类
其对象只能动态分配。
你可以举个例子:
#include <iostream>
using namespace std;
// A class whose object can only be dynamically created
class Test
{
private:
~Test() { cout << "Destroying Object\n"; }
public:
Test() { cout << "Object Created\n"; }
friend void destructTest(Test* );
};
// Only this function can destruct objects of Test
void destructTest(Test* ptr)
{
delete ptr;
cout << "Object Destroyed\n";
}
int main()
{
/* Uncommenting following following line would cause compiler error */
// Test t1;
// create an object
Test *ptr = new Test;
// destruct the object to avoid memory leak
destructTest(ptr);
return 0;
}
如果您尝试创建一个静态对象编译器会出错