2013-10-24 106 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

相關問題