我想用单例模式实现类,并让类的实例调用私有成员函数。
#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;
}
以上更正的代码是实际代码。
答案 0 :(得分:2)
GetInstance是一个私有的测试函数,因此无法从类外部访问,需要将getInstance公开。
函数是静态的这一事实,仅仅意味着对象不需要访问函数,尽管它只能从作为对象一部分的其他代码访问。
为什么有静态私有函数呢?这种使用可以看作是优化的一部分,因为当一个函数是一个成员函数而不是一个静态函数时,它隐含地接收变量&#39; this&#39;这不是免费的。
编辑: 因为你更正了代码,现在的修正应该是使print函数公开,因为私有函数只能从它所属的类中调用,如果你有一个该类的实例也没关系,你可以,但是,从静态类中调用它(可以从GetInst调用它,但不能从Main调用它)。
答案 1 :(得分:0)
访问控制处理您从访问的上下文。您正在访问该班级的私人成员。但是,类成员访问表达式(Test::getInstance()->print()
)位于main
函数中。此功能没有访问私有成员的特殊权限。因此,意味着此表达式将无法从其出现的上下文中访问对象的私有成员。