当前位置: 首页 > 知识库问答 >
问题:

如果是NULL,如何引用Obj1并调用show方法

谷泽宇
2023-03-14

我试图创建一个一次只能创建一个对象的类,所以我创建了私有构造函数和一个公共包装器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

共有2个答案

陆建木
2023-03-14

几乎可以肯定的是,编译器正在通过内联优化对show的调用。此外,它还可以使其成为“伪静态”函数,因为在show中没有对任何其他类成员的引用。

要“破坏”优化(并导致崩溃),您可以执行以下操作之一:

  1. 声明show函数虚拟
  2. 在函数中引用一个非静态成员(例如temp
宋琛
2023-03-14

在真空中,这只是因为你的功能:

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是局部变量,则在函数结束之后。特别是,除