2017-02-24 19 views
0

我不能在friend函數內實例化測試類,編譯器拋出錯誤ptr未在此範圍內聲明。我相信朋友功能可以訪問班級的所有私人和公共成員,但我得到這個錯誤。我無法弄清楚我哪裏出錯了?無法實例化朋友函數中的類?我沒有在範圍內聲明錯誤

#include<iostream> 
using namespace std; 

class test; 
test* friendOfTest(); 

class test{ 
private: 
    static test* ptr; 
public: 
    friend test* friendOfTest(); 
    void someMethod(){ cout<<"someMethod()\n";} 
}; 

test* test::ptr=NULL; 

test* friendofTest(){ 
    ptr = new test; //Error,ptr not declared in this scope in this line 
    return ptr; 
} 


int main(){ 
    test* t; 
    t = friendofTest(); 
    t->someMethod(); 
    return 0; 
} 
+0

'test :: ptr = new test;' – LogicStuff

+0

'test :: ptr = new test;' – YSC

+1

8秒太晚了> _ <我投票結束這個問題,因爲對別人沒用。 – YSC

回答

1

是的,您可以訪問PTR,但你的語法是錯誤的:

test* friendofTest(){ 
    test::ptr = new test; // note test:: 
    return test::ptr; 
} 

友元函數將不會像一個成員函數到您的類,它只是允許它即使被宣佈爲私人或受保護的成員也可以訪問。

friendofTest在這種情況下仍然會從你的類完全分開功能,但你可以訪問它的靜態test成員通過範圍解析操作像往常一樣,即使它聲明爲private。

+0

我試圖訪問ptr使用範圍解析像你說的,但我仍然得到這個奇怪的錯誤。在函數'test * friendofTest()' 錯誤:'test * test :: ptr'是私有的 test * test :: ptr = NULL; ^ 錯誤:在此範圍內 test :: ptr = new test; –

+0

@SadikKhan檢查[這](http://stackoverflow.com/questions/29574616/friend-functions-and-static-data-members)的問題。 – Steeve

0

有兩種可能性讓程序編譯。

作爲朋友函數的第一個在類外定義的是使用靜態類數據成員的限定名。例如

test* friendOfTest(){ 
    test::ptr = new test; //Error,ptr not declared in this scope in this line 
    return test::ptr; 
} 

第二個是定義類內的函數。在這種情況下,它將在班級範圍內。

根據C++標準(11.3好友)

7 Such a function is implicitly inline. A friend function defined in a class is in the (lexical) scope of the class in which it is defined. A friend function defined outside the class is not (3.4.1).

例如

class test{ 
private: 
    static test* ptr; 
public: 
    friend test* friendOfTest(); 

friend test* friendOfTest(){ 
    ptr = new test; //Error,ptr not declared in this scope in this line 
    return ptr; 
} 

    void someMethod(){ cout<<"someMethod()\n";} 
}; 

下面是示範方案

#include<iostream> 
using namespace std; 

class test; 
test* friendOfTest(); 

class test{ 
private: 
    static test* ptr; 
public: 
    friend test* friendOfTest(); 
/* 
friend test* friendOfTest(){ 
    ptr = new test; //Error,ptr not declared in this scope in this line 
    return ptr; 
} 
*/ 
    void someMethod(){ cout<<"someMethod()\n";} 
}; 

test* test::ptr=NULL; 

test* friendOfTest(){ 
    test::ptr = new test; //Error,ptr not declared in this scope in this line 
    return test::ptr; 
} 


test* friendofTest(); 

int main(){ 
    test* t; 
    t = friendOfTest(); 
    t->someMethod(); 
    return 0; 
} 

#include<iostream> 
using namespace std; 

class test; 
test* friendOfTest(); 

class test{ 
private: 
    static test* ptr; 
public: 
// friend test* friendOfTest(); 

friend test* friendOfTest(){ 
    ptr = new test; //Error,ptr not declared in this scope in this line 
    return ptr; 
} 

    void someMethod(){ cout<<"someMethod()\n";} 
}; 

test* test::ptr=NULL; 
/* 
test* friendOfTest(){ 
    test::ptr = new test; //Error,ptr not declared in this scope in this line 
    return test::ptr; 
} 
*/ 

test* friendofTest(); 

int main(){ 
    test* t; 
    t = friendOfTest(); 
    t->someMethod(); 
    return 0; 
} 

這兩個程序都能成功編譯。

+0

我嘗試了這兩種方法,但我仍然沒有在此範圍內聲明ptr。 –

+0

@Sadik Khan看到我更新的帖子,其中顯示了兩個成功編譯的演示程序。 –

+0

@Sadik Khan在第二種方法中忘記了使用限定名return test :: ptr; –