2012-04-03 53 views
2

啊是的「朋友」是最令人畏懼的關鍵字,不太面向對象,不完全是程序性的。那麼這裏再次出現問題,我可以想到所有可能的警告,並且所有GCC都可以告訴我讀取poly()沒有在此範圍內聲明(main.cpp)。任何人都可以幫我弄清楚我做錯了什麼?我試過在閱讀poly中重新排列代碼,但這並沒有幫助,其他函數原型似乎也沒有改變這種行爲。我只知道當我弄清楚它是什麼時我會打我自己。與C++中的朋友麻煩

//main.cpp 
#include "Polynomial.h" 

int main() 
{ 
Polynomial test = readPoly(); 
} 

//Polynomial.h 
class Polynomial 
{ 
    public : 
    /** creates the zero Polynomial and sets the default output character*/ 
    Polynomial(); 

    /** creates the constant Polynomial c */ 
    Polynomial(int c); 

    /** creates a Polynomial with one term c*x^d */ 
    Polynomial(int c, int d); 

    Polynomial(const Polynomial& toCopy); 



    friend const Polynomial readPoly(); 
    void insert(Term* term); 
} 
//Polynomial.cpp 

const Polynomial readPoly() 
{ 
    cout << "How many terms? "; 
    int termQty = 0; 
    cin >> termQty; 

    int coefficient,degree; 
    Polynomial newPoly; 

    for (int n = 0; n <= termQty; n++) 
    { 
     cin >> coefficient >> degree; 
     newPoly.insert(new Term(coefficient,degree)); 
     newPoly.degreeCached = max(degree, newPoly.degreeCached); 
    } 

    return newPoly; 
} 
+2

你是否將面向對象與程序對比? – Saintali 2012-04-03 06:40:51

+1

「Term」在哪裏申報? – 2012-04-03 06:44:18

+0

我想你應該在'Polynomial'之外的'main'可以知道的地方聲明'readPoly()'。 – 2012-04-03 06:45:29

回答

3

朋友聲明聲明函數在最近的 封閉命名空間範圍存在,但它只允許在類中或通過ADL將該聲明顯示爲 。由於該函數沒有 任何使用Polynomial的參數,ADL不會找到它。只需在周圍命名空間範圍內添加一個 函數聲明即可。或者讓 它是一個靜態成員,而不是friend —在這種情況下,似乎 更適合(對我來說至少)。在這種情況下,您可以將它稱爲 和Polynomial::readPoly()(或者只是Polynomial::read(),因爲 範圍分辨率明確表示我們正在閱讀的內容)。這種靜態成員可能是工廠 函數慣用語的最常用實現。

+0

謝謝你,修正它,是的,可能是更合適的,但它是一個家庭作業,這是規範,所以我不會爭辯。 – awiebe 2012-04-03 19:55:50

0

readPoly確實沒有在此範圍內聲明。在標題中添加一個函數聲明。 friend子句只說明這個函數可以訪問私有成員,但它並不聲明這個函數本身。所以在主要功能是真的沒有宣佈。

1

看起來您在使用它之前還沒有聲明readPoly()。您可以重新排列源(更多一些),使其出現上述main()或在使用前最好還是把它聲明:

//Polynomial.h 

class Polynomial 
{ 
.... 
}; 

extern const Polynomial readPoly(); 
+1

我認爲將聲明放在標題中更有意義,這樣您就不必在需要的地方聲明它。 – 2012-04-03 06:44:22

+0

@izomorphius該函數不是「Polymonial」的成員,所以不一定。 – trojanfoe 2012-04-03 06:45:23

+0

@izomorphius:如果功能需要通過transaltion單位進行訪問,那麼它應該駐留在標題中。 – 2012-04-03 06:48:25