2017-01-12 4 views
1

Я хочу реализовать класс с одноэлементным шаблоном и иметь экземпляр класса, вызывающего функцию частного участника.статический экземпляр класса не может вызвать функцию частного участника. C++

#include <iostream> 
using namespace std; 

class Test { 
private: 
    Test(){} 
    static Test* getInstance() 
    { 
     static Test obj; 
     return &obj; 
    } 
public: 
    void print() 
    { 
     cout<<"test function"<<endl; 
    } 


}; 


int main(int argc, const char * argv[]) { 
    Test::getInstance()->print(); //error! 
    return 0; 
} 

и я получаю сообщение об ошибке Сформировать сообщение Xcode

'print' is a private member of 'Test'

Я думаю, что статический экземпляр может также вызвать функцию частного члена.

Извините, я написал здесь неправильный код. getInstance() должен быть открытым, как показано ниже:

#include <iostream> 
using namespace std; 

class Test { 
private: 
    Test(){} 
    void print() 
    { 
     cout<<"test function"<<endl; 
    } 
public: 
    static Test* getInstance() 
    { 
     static Test obj; 
     return &obj; 
    } 
}; 

int main(int argc, const char * argv[]) { 
    Test::getInstance()->print(); 
    return 0; 
} 

выше исправленный код является фактическим кодом.

+3

Я подозреваю, что вы используете старый компилятор. Нет, ошибка от 'Test :: getInstance()', которая является частной функцией-членом. И, следовательно, невозможно получить доступ за пределами класса. – WhiZTiM

+3

Забавный факт: синглтон был * смолистым и пернатым * его авторами. –

+0

Это код, который вы скомпилировали, когда вы получили фактическое сообщение об ошибке, которое вы указали? –

ответ

2

GetInstance - это частная функция теста, и поэтому к нему нельзя получить доступ извне класса, вы должны сделать getInstance общедоступным.

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

Почему у вас есть статическая частная функция? такое использование можно рассматривать как часть оптимизации, так как когда функция является функцией-членом, а не статической, она неявно получает переменную «это», которая не является свободной.

EDIT: , потому что вы скорректировали код, теперь исправление должно публиковать функцию печати, поскольку частную функцию можно вызывать только из класса, членом которой она является, не имеет значения, есть ли у вас экземпляр из этого класса вы можете, однако, вызвать его изнутри статического класса (его можно вызвать из GetInst, но не из Main).

0

Управление доступом контролирует контекст, к которому вы обращаетесь, от. Вы получаете доступ к частному члену класса. Однако выражение доступа к члену класса (Test::getInstance()->print()) находится в функции main. Эта функция не имеет специального разрешения на доступ к закрытым членам. Следовательно, это означает, что это выражение не сможет получить доступ к частным членам объекта из контекста, который он появляется.

Смежные вопросы