2016-11-21 210 views
1

我遇到的代码来了,如同下面,这基本上是我们使类的构造私人和提供一个静态公共函数创建一个单独的类的实例的私有成员函数(构造函数)需要时的课程实例。如何静态函数访问类

我的问题是当我们调用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; 
} 

我与G ++编译错误:

file.cpp: In static member function ‘static void Sample::statFunc()’: 
file.cpp:61: error: cannot call member function ‘void Sample::testFunc()’ without object. 

如果我们可以用静态公网访问类的私有函数函数那么为什么我得到这个错误?

+0

简答:恕我直言,是的。恕我直言,你的代码没有问题。 'getInstance'是'Singleton'类的成员,因此它可以调用该类的所有方法,甚至是私有方法。 –

回答

0

上面的代码工作的原因是因为getInstance()的实现调用不requrire对象实例的构造函数。

静态成员函数属于类不是对象。因此,在调用静态成员函数时没有对象的实例,因为不存在指针,所以不能访问this指针。如果要从静态函数访问非静态私有成员函数,则需要将该对象的引用传递给该函数。例如

例如

class foo { 
    public: 
      foo(int i) : myInt(i) {} 
      static int myStaticMethod(foo & obj); 
    private: 
      int myInt; 
    }; 

    int foo::myStaticMethod(foo & obj) { 
      return obj.myInt; 
    } 

#include <iostream> 


int main() { 
foo f(1); 
std::cout << foo::myStaticMethod(f); 
return 0; 
}; 
+0

感谢您的回答。所以我从上面的理解是,因为ctor是一个特殊的成员函数,它不需要任何对象被调用,所以它可以使用静态函数(没有任何对象)来调用,但其他类的普通成员函数需要类实例为了调用它们,所以它们不能在没有对象的静态函数内被调用。 – Viki

+0

是啊 – TomJ

1

静态函数可以调用类的任何私人或公共成员函数不会造成任何实例?

创建一个实例。

instance = new Singleton(); 

new关键字创建Singleton对象。

而且,是的,因为Singleton::getInstance是该类的成员函数,所以它有能力调用构造函数(尽管注意你只是间接地这样做),不管它是否为static

0

回答你问题的第二部分,您已经后来又说:

class Sample 
{ 
private: 
    void testFunc() 
    { 
    std::cout << "Inside private function" << std::endl; 
    } 
public: 
    static void statFunc() 
    { 
    std::cout << "Inside static function" << std::endl; 

    Sample s; 
    s.testFunc();   // this is OK, there is an object (s) and we call 
          // testFunc upon s 

    // testFunc();   // this is not OK, there is no object 
    } 
    void InstanceFunction() 
    { 
    std::cout << "Inside public instance function" << std::endl; 
    testFunc(); 
    } 
}; 


int main() 
{ 
    Sample s; 
    s.InstanceFunction(); 

    Sample::statFunc(); 
    return 0; 
} 

调用从内statFunctestFunc();不能做,因为testFunc(私人或不)是一个实例功能,你需要一个Sample反对说testFunc可根据操作,但是statFuncstatic功能,因此没有Sample对象。

错误信息很清楚。

仅当您提供对象时才能从statFunc调用testFunc,请参阅上面的代码。

+0

我认为,以类似的方式,单例类的构造函数是一个类函数,不应该被静态函数调用。如果构造函数可以在静态函数内部调用,那么为什么不是正常的私有函数会让我困惑呢? – Viki

+0

@Vikram记得,构造函数不是一个普通的成员函数。当你写'instance = new Singleton();'你创建一个对象时,他的构造函数被调用到正在创建的对象上。 –

+0

@Vikram,我编辑了答案,现在有一个例子,你可以从'statFunc'内调用'testFunc'。 –