清理静态的机制为什么/如何获得访问权限,从而允许它调用私有成员
Why/How does the mechanism that cleans up statics, gain access rights that allow it to call private members?
我测试了一个在c++中声明单例类的模式,该模式使默认的析构函数为'private',但该模式不通过任何成员调用使用该析构函数。
我在Ubuntu QQ上使用gnu g++编译器测试了这段代码-析构函数在程序终止时被调用,尽管指定为"private"。
谁/什么/如何调用这个析构函数,因为它被指定为private?
注意:我来自Delphi/Object Pascal世界,ObjectPascal不支持静态类声明——尽管有几种方法可以创建单例。根据我的经验,'private'('strict private'…)是 private 。在c++中,
解释吗?
对象通常由称为getInstance
之类的static
成员函数实例化,该函数然后为您提供对该对象的引用。因为它是一个成员函数,所以它可以访问构造函数。
经典示例:
class S
{
public:
// This is a member function so can access the constructor of S
static S& getInstance()
{
static S instance;
return instance;
}
private:
S() {};
S(S const&);
void operator=(S const&);
};
(OP后编辑编辑)
将析构函数设为私有可防止显式调用。
如果析构函数是public的,这将是合法的:
MyClass.getInstance().~MyClass();
静态存储对象的析构函数被调用作为从main()返回或调用exit()的结果。
典型的单例类具有一个静态成员函数,该函数返回指向该单例对象的指针。例如:
Singleton *Singleton::instance();
,其中instance()
为静态成员函数。静态成员函数可以调用私有构造函数
它们是私有的,因为您不希望允许任何外部代码构造或销毁该对象。单例模式通常有一个静态实例,通过工厂方法初始化和删除。
tempalte <class T>
class Singleton
{
public:
static T* GetInstance()
{
if(!m_sInstance)
{
m_sInstance = new T();
}
return m_sInstance;
}
static void DestroyInstance()
{
delete m_sInstance;
m_sInstance = 0;
}
private:
static T* m_sInstance;
};
class Foo : public Singleton<Foo>
{
friend class Singleton<Foo>;
private:
Foo();
~Foo();
};
所以你可以调用Foo::GetInstance()
和Foo::DestroyInstance()
来访问和删除单例对象
相关文章:
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++为什么尽管我调用了void函数,它却不起作用
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 当我尝试在 Main 中调用插入函数时,它不是取数字?
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 接收字符串并使用它来调用方法C++
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 即使没有调用这个递归函数,它是如何工作的?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- 如果无限循环在C 中仍然不确定的行为,如果它调用共享库
- C++模板,它调用带有参数向量的函数
- 如何将"shebang"文件的内容馈送到它调用的程序中?
- Boost Python def 成员函数,它调用静态函数,其中 self 作为唯一的参数
- 如何让它调用正确的构造函数
- 清理静态的机制为什么/如何获得访问权限,从而允许它调用私有成员
- C++单线程工作,在新线程上它调用"abort()"
- MFC:从不同的类调用上下文菜单单击的函数,而不是让它调用其默认函数