Я столкнулся с кодом, подобным приведенному ниже, который в основном является примером одноэлементного класса, в котором мы создаем конструктор класса private и предоставляем одну статическую публичную функцию для создания экземпляр класса при необходимости.Как статическая функция, получающая доступ к частной функции-члену (конструктору) класса
Мой вопрос в том, что мы вызываем оператор new
для создания объекта одноэлементного класса внутри статической функции, тогда конструктор класса, безусловно, будет вызываться. Я смущен, как это происходит, поскольку, насколько мне известно, статическая функция может получить доступ только к статическим членам и статическим функциям класса. Как тогда он может получить доступ к частной функции (конструктору) класса?
Может ли статическая функция вызывать любую закрытую или публичную функцию-член класса без создания какого-либо экземпляра?
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton *getInstance();
private:
Singleton(){}
static Singleton* instance;
};
Singleton* Singleton::instance = 0;
Singleton* Singleton::getInstance()
{
if(!instance) {
instance = new Singleton(); //private ctor will be called
cout << "getInstance(): First instance\n";
return instance;
}
else {
cout << "getInstance(): previous instance\n";
return instance;
}
}
int main()
{
Singleton *s1 = Singleton::getInstance();
Singleton *s2 = Singleton::getInstance();
return 0;
}
Но когда я написал пример кода, как показано ниже:
class Sample
{
private:
void testFunc()
{
std::cout << "Inside private function" <<std::endl;
}
public:
static void statFunc()
{
std::cout << "Inside static function" <<std::endl;
testFunc();
}
};
int main()
{
Sample::statFunc();
return 0;
}
Я получаю ошибку компиляции с г ++:
file.cpp: In static member function ‘static void Sample::statFunc()’:
file.cpp:61: error: cannot call member function ‘void Sample::testFunc()’ without object.
Если мы можем получить доступ к собственной функции класса со статическими общественности функция, то почему я получаю эту ошибку?
Короткий ответ: ИМХО да. И IMHO нет проблем с вашим кодом. 'getInstance' является членом класса Singleton, поэтому он может вызывать все методы класса, даже частные. –