类的静态实例不能调用私有成员函数。 C ++

时间:2017-01-12 17:12:12

标签: 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

的错误消息
  

&#39;打印&#39;是&#39; Test&#39;

的私人会员

我认为静态实例也可以调用私有成员函数。

道歉,我在这里写错了代码。 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;
}

以上更正的代码是实际代码。

2 个答案:

答案 0 :(得分:2)

GetInstance是一个私有的测试函数,因此无法从类外部访问,需要将getInstance公开。

函数是静态的这一事实,仅仅意味着对象不需要访问函数,尽管它只能从作为对象一部分的其他代码访问。

为什么有静态私有函数呢?这种使用可以看作是优化的一部分,因为当一个函数是一个成员函数而不是一个静态函数时,它隐含地接收变量&#39; this&#39;这不是免费的。

编辑: 因为你更正了代码,现在的修正应该是使print函数公开,因为私有函数只能从它所属的类中调用,如果你有一个该类的实例也没关系,你可以,但是,从静态类中调用它(可以从GetInst调用它,但不能从Main调用它)。

答案 1 :(得分:0)

访问控制处理您从访问的上下文。您正在访问该班级的私​​人成员。但是,类成员访问表达式(Test::getInstance()->print())位于main函数中。此功能没有访问私有成员的特殊权限。因此,意味着此表达式将无法从其出现的上下文中访问对象的私有成员。