2011-01-23 14 views
-2
#include<iostream> 
#include<stdlib.h> 
#include"header_complex.h" 

using namespace std; 




class Complex 
{ 
private: 
float real,imag; 
public: 
Complex(); //default cnstructor 
Complex(float, float); //parametrize constructor 
void set_real(float); 
void set_imag(float); 
float get_real(); 
float get_imag(); 
void input(); 
void display(); 

}; 


int main() 
{ 
Complex c1; // object creation 

c1.display(); 
c1.input(); 
c1.display(); 

return EXIT_SUCCESS; 
} 


//Functions definations 

Complex::Complex(float a=0, float b=0) 
{ 
    real = a; 
    imag = b; 
} 

void Complex::set_real(float a) 
{ 
    a = real; 
} 

void Complex::set_imag(float a) 
{ 
    a = imag; 
} 

float Complex::get_real() 
{ 
    return real; 
} 
float Complex::get_imag() 
{ 
    return imag; 
} 

void Complex::input(){ 
    cout << "Enter Real part "; 
    cin >> real; 
    cout << "Enter Imaginary part " ; 
    cin >> imag; 
} 

void Complex::display() 
{ 
    cout << "Real part is " << real; 
    cout << "Imaginary part is " << imag; 
} 
+0

コードをフォーマットしてください。ありがとうございます。 – ThomasMcLeod

+0

{}ボタンを使用してソースコードをフォーマットしてください。 –

+4

問題は何ですか。エラーはありますか?何がうまくいかない - 詳細を含めるのを恐れないでください。 – nos

答えて

3

エラーLNK2019:未解決の外部 シンボル "パブリック:__thiscall コンプレックス::コンプレックス(無効)" (?? 0Complex @@ QAE @ XZ) 関数_main

エラーメッセージを読み、理解することは、先に進むことを学ぶために非常に重要なスキルです。 "Unresolved external"は、識別子を使用しているが、付属の.objファイルと.libファイルのいずれの識別子も定義されていないと、リンカが生成するエラーメッセージです。

Complex :: Complex(void)は、不明な識別子です。これは、引数をとらないComplexクラスのコンストラクタです。あなたはそれを宣言しました、あなたはそれを使用します、あなたはそれのためのコードを書かなかっただけです。

エラーリストウィンドウのエラーメッセージを選択しF1キーを押すと、リンカーやコンパイラのエラーに関するヘルプが表示されます。

+0

しかし、私が2つのコンストラクタをマージしたのは合法的です。 –

+0

それらをマージすることはできますが、そうした場合、クラス定義に 'Complex();'を宣言するべきではありません。 'Complex(float、float);のみを宣言し、パラメータのデフォルト値を提供します。 –

0

関数定義でデフォルトパラメータを指定することはできません。関数宣言でそれを行う必要があります。代わりに、2つのコンストラクタを宣言する、それは誰もがそう漠然とエラーメッセージについて説明しますなぜ私が(理解していない

Complex::Complex(float a, float b) 
+0

あなたは正しいですが、既定のコンストラクタ定義を追加した後、Linux上でg ++を使用して私のためにコンパイルしました。さらに、-pedanticフラグがスローされました。 –

+1

これは完全に真実ではありません。関数定義でのデフォルトパラメータの指定は、宣言で指定されていなければ、完全に正当です。 「C++関数のデフォルト引数」(http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr237)を確認することができます。 .htm)を参照してください。 –

+0

私はこの概念を混乱させる。私は2つのコンストラクタをマージできるかどうか? –

1

になるように、デフォルト値を削除し、あなたの定義に続いて1

Complex(float a=0, float b=0); 

のように宣言エラーメッセージをコピーして貼り付けることなく、「リンカエラー」と呼ばれます)。つまり、次のように変更して、Linux上でプログラムをコンパイルしてリンクすることができました。

1)複雑なクラス定義をheader_complex.hというヘッダーファイルに移動しました。これはメインプログラム#includeです。

2)私は、デフォルトコンストラクタの定義を追加しました:

Complex::Complex() : real(0), imag(0) {} 

3)私は、コマンドラインに-lstdc++を追加しました:

gcc complex.cpp -lstdc++ 

ところで、私はあなたがするつもりだと思います表示方法を変更してendlを追加したい場合:

cout << "Real part is " << real << endl; 
    cout << "Imaginary part is " << imag << endl; 
0

Emm ...を参照してくださいそれを使用しながら、あなたがデフォルトコンストラクタが欠落しているMS:

Complex c1; // here's the error - you have no defined Complex::Complex() {} method 
関連する問題