Как ссылка на obj1 и вызов метода show, если он равен NULL - PullRequest
4 голосов
/ 17 октября 2019

Я пытаюсь создать класс, который может разрешить создание только одного объекта за раз, поэтому я создал приватный конструктор и один метод 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->show()?
ВЫХОД:

count is 0
Created 1
Showing
count is 1
Object is NULL
Showing

Ответы [ 2 ]

4 голосов
/ 17 октября 2019

В вакууме, это просто потому, что ваша функция:

public:
void show()
{

    cout<<"Showing \n";
}

на самом деле не пытается что-то делать с объектом - чтобы понять, почему это работает, просто подумайте о членефункционирует как абстракция над свободной функцией , принимающей объект в качестве первого аргумента:

void show(Object* this)
{

    cout<<"Showing \n";
}

Теперь легко понять, почему это работает, поскольку вы не используете this -нулевой указатель.

Если вы измените что-то аля. это:

public:
void show()
{

    cout<< this->temp << "Showing \n";
}

Ваша программа почти наверняка завершится сбоем.

1 голос
/ 17 октября 2019

Здесь почти наверняка происходит то, что компилятор оптимизирует вызов show, вставляя его. Кроме того, он также может сделать ее «псевдостатической» функцией, поскольку внутри show нет ссылки на любой другой член класса.

Чтобы «сломать» оптимизацию (и вызвать сбой), выможет выполнить одно из следующих действий:

  1. Уменьшить функцию show virtual
  2. Ссылка на нестатический элемент (например, temp) внутрифункция
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...