2016-05-13 100 views
1

正如話題所述。有沒有可能做到這一點?我能夠在超載「+」運算符中實現這一點,但是,我無法通過'< <'運算符來實現。C++ <<不帶朋友功能的操作符重載

這是與朋友的功能對我的作品的代碼示例:

class Punkt2D 
{ 
    int x,y; 

    public: 
     Punkt2D(int wartoscX, int wartoscY) : x(wartoscX), y(wartoscY) {} 
     friend ostream& operator<<(ostream& out, Punkt2D& punkt); 
}; 

ostream& operator<<(ostream& out, Punkt2D& punkt) 
{ 
    out << "(" << punkt.x << ", " << punkt.y << ")" << endl; 
    return out; 
} 

int main() 
{ 
    Punkt2D p1(10,15); 

    cout << p1 << endl; 
    return 0; 
} 

我嘗試這個代碼在「+」不結交功能。其他運營商也有可能嗎?也許這是一個愚蠢的問題,但我很新的C++,找不到的話題:(

class Vector 
{ 
    public: 

    double dx, dy; 
    Vector() {dx=0; dy=0;} 
    Vector(double x, double y) 
    { 
     cout << "Podaj x " << endl; 
     cin >>x; 
     cout << "Podaj y " << endl; 
     cin >> y; 
     dx = x; dy = y; 

    } 
    Vector operator+ (Vector v); 
}; 


Vector Vector::operator+ (Vector v) 
{ 
    Vector tmpVector; 
    tmpVector.dx = dx +v.dx; 
    tmpVector.dy = dy+ v.dy; 
    return tmpVector; 
} 

int main() 
{ 
    double d,e; 

    Vector a(d,e); 
    Vector b(d,e); 
    Vector c; 
    c = a +b; 
    cout<<endl << c.dy << " " << c.dx; 
    return 0; 
} 

回答

1

只要函數僅調用類的public成員函數(或訪問public數據成員,如果有的話)並不需要是一個朋友。

您的Vector示例僅訪問public成員,因此它的工作原理。

您的Punkt2D正在訪問private成員,所以經營者需要成爲朋友。

+0

好吧,我有點困惑,因爲答案似乎是矛盾的。 如果該類的所有成員都是公共的,那麼該代碼行看起來會不會使該函數變得友好? 我只關注ostream元素,即函數的聲明和定義。 – Andy

+0

由於聲明不是類的成員(例如在頭文件中),所以在類聲明之後將聲明形式'std :: ostream&operator <<(std :: ostream&out,const Punkt2D&punkt)'。運算符<<()的定義(即實現)(它需要在某處,但不需要在頭中,除非被內聯),則需要避免訪問「私有」或「受保護的成員全班同學 – Peter

+0

謝謝彼得:) – Andy

1

它需要的朋友可以訪問私有成員。

在任何資源Vector成員是公開的,所以這是不同的。

0

流運算符:

operator << output 
operator >> input 

當使用這些作爲物流運營商(而不是二進制移位)的第一個參數是一個流。由於您無權訪問流對象(它不是您的修改對象),因此這些對象不能是成員操作符,因此它們必須位於該類的外部。因此,他們必須是班上的朋友,或者有權使用公開的方法來爲你做流式傳輸。