2017-10-06 16 views
-1

friend関数とコンストラクタを使用して値を初期化するために2つの複素数を追加しようとしていますが、 '未定義のcomplex1 :: complex1()'参照があります。friend関数を使用して複素数について

#include<iostream> 
using namespace std; 

class complex1 
{ 
    float real,img; 
public: 
    complex1(); 
    complex1(float a,float b) 
    { 
     real=a; 
     img=b; 
    } 
    friend complex1 sum(complex1,complex1); 
    friend void display(complex1); 
}; 

complex1 sum(complex1 c1,complex1 c2) 
{ 
    complex1 c3; 
    c3.real=c1.real+c2.real; 
    c3.img=c1.img+c2.img; 
    return c3; 
} 

void display(complex1 c) 
{ 
    cout<<c.real<<"+j"<<c.img; 
} 

int main() 
{ 
    complex1 c1(100.9,200.9); 
    complex1 c2(50.9,50.9); 
    complex1 c=sum(c1,c2); 
    display(c);  //display and sum is given directly because it is friend 
    return 0; 
} 
+0

'complex1のC = SUM(C1、C2);'あなたは) '何の実装(' complex1を(持っていないデフォルトのコンストラクタ、とC 'を構築しています;あなたのクラスで)。次に、関数 'sum'でそれを使用しています。また、定義されていない 'complex1'型で' operator = 'を使用しています。 – Fureeish

+2

@Fureeish 'operator ='は大したことではありません。これはコンパイラによって作成され、コピーコンストラクタまたはデストラクタを定義する必要がないため、3のルールを破ることはありません。 –

+0

@FantasticMrFox正しい。コンテキストの場合と同じようにコメントを残しておきます – Fureeish

答えて

0

あなたのfriend機能の利便性とは関係ありません。

complex1(); 

あなたは決して定義しません。次にcomplex1 c3;sumで使用します。あなたはデフォルトコンストラクタを定義する必要があります。

complex1() { 
    //do something 
} 

Here is a live example.

関連する問題