我试图创建一个一次只能创建一个对象的类,所以我创建了私有构造函数和一个公共包装器getInstance()方法,该方法将为这个类创建对象,代码如下
#include <iostream>
using namespace std;
class sample
{
static int cnt;
int temp;
private: sample()
{
//temp++;
cnt++;
cout<<"Created "<<++temp<<endl;
}
public:
void show()
{
cout<<"Showing \n";
}
static sample* getInstance()
{
cout<<"count is "<<cnt<<endl;
if(cnt<1)
return (new sample());
else
return NULL;
}
};
int sample::cnt=0;
int main()
{
// cout<<"Hello World";
sample *obj = sample::getInstance();
obj->show();
sample *obj1 = sample::getInstance();
if(obj1 == NULL)
cout<<"Object is NULL\n";
obj1->show();
return 0;
}
obj1怎么样-
count is 0
Created 1
Showing
count is 1
Object is NULL
Showing
几乎可以肯定的是,编译器正在通过内联优化对show
的调用。此外,它还可以使其成为“伪静态”函数,因为在show
中没有对任何其他类成员的引用。
要“破坏”优化(并导致崩溃),您可以执行以下操作之一:
show
函数虚拟
temp
)在真空中,这只是因为你的功能:
public:
void show()
{
cout<<"Showing \n";
}
实际上,不要试图对对象做任何事情——要正确理解这一点,只需将成员函数视为自由函数的抽象,将对象作为其第一个参数:
void show(Object* this)
{
cout<<"Showing \n";
}
现在很容易明白为什么这样做是有效的,因为您没有使用this
——空指针。
如果你改变了某件事,这是:
public:
void show()
{
cout<< this->temp << "Showing \n";
}
你的程序几乎肯定会崩溃。
问题内容: 我已阅读并重新阅读了《 Java Concurrency in Practice》,在此主题中阅读了多个线程,阅读了IBM文章《处理InterruptedException》,但我根本不了解某些我认为可以打破的东西。分为两个问题: 如果我从来没有自己打过其他线程,什么会触发 InterruptedException ? 如果我从未使用自己的 interrupt() 中断其他线程(例如,
我想问更多与测试有关的概念性问题。我正在使用Mockitos进行单元测试。
每当我尝试使用firebase auth注册用户时,我的应用程序就会崩溃。我的代码如下:
问题内容: 我想要进行属性调用,例如返回某种方法的结果。我怎样才能做到这一点? 编辑:我很快问:看起来我可以用 这样行吗? 问题答案: 使用属性装饰器 使用__dict__进行处理很脏,尤其是在@property可用时。
问题内容: 我正在阅读代码。有一个定义方法的类。我发现此方法用于销毁该类的实例。但是,我找不到使用此方法的地方。这样做的主要原因是我不知道如何使用此方法,可能不是这样的:。那么,我的问题是如何调用该方法? 问题答案: 是终结器。当对象被垃圾回收时调用该方法,该操作在删除该对象的所有引用之后的某个时间发生。 在一个简单的情况下,这可能是在你说完之后,或者如果x是局部变量,则在函数结束之后。特别是,除