2013-10-24 69 views
2

有没有什么办法可以在朋友函数中不允许私有构造,如果我们的类中有私人构造函数和朋友函数。只有静态方法应该是负责对象创建和其他比这个编译器应该是闪烁的错误讯息不允许在朋友函数中使用私有构造函数调用

#include <iostream> 
#include <memory> 
using namespace std; 

class a 
{ 

public: 
    void see() 
    { 

    cout<<"Motimaa"; 

    } 
    static a& getinstance() 
    { 
     static a instance; 
     return instance; 
    } 

private: 
    a() {}; 
    friend void access(); 
}; 
void access() 
{ 
a obj; 
obj.see();//still friend function can access 
} 

int main() 
{ 

a::getinstance().see(); 

access(); 
return 1; 

} 
+3

号当你做了它的朋友,你认为这个功能是做正确的事。它可以遍历你的私有变量;如果你不能相信它的实现,通过私有构造函数创建对象应该是你最小的担心。 –

回答

0

友元函数可以访问结识类的所有成员。

1

好友功能可以访问所有私人成员和变量,但是对于您的问题有一个潜在的解决方法,假设您试图显式地停止意外使用默认构造函数。

您可能会使默认构造函数杀死该程序。现在,创建第二个构造函数,它至少需要一个参数,即使它是一个无意义的论点。

下面是一个例子:

private: 
    a() { cerr<<"Invalid call to constructor for object a!"; exit(); }; 
    a(bool dummyArg) {} 

public: 
    static a& getInstance() { 
    static a instance(true); 
    return a; 
    } 
+0

似乎是不允许朋友函数使用默认构造函数意外构造对象的好方法。但仍然可以通过以下方式调用friend函数:a obj(true); – user2907032

相关问题