2011-01-23 1 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을 : 인을 사용하는 동안 MS는 기본 생성자를 놓치고되지 않은 외부 기호를 "공개 : __thiscall 복잡한 :: 복합 (무효)" (?? 0Complex @@ QAE @ XZ)는

읽기 _main 기능에서 참조하는 오류 메시지를 이해하는 것은 앞서 얻을 수 배울 수있는 매우 중요한 기술이다. "Unresolved external"는 링커가 식별자를 사용하지만 제공된 .obj 및 .lib 파일에서 해당 식별자의 정의를 찾을 수 없을 때 생성되는 오류 메시지입니다.

Complex :: Complex (void)는 누락 된 식별자입니다. 인수를 취하지 않는 Complex 클래스의 생성자입니다. 당신은 그것을 선언했다, 당신은 그것을 사용한다, 당신은 단지 코드를 작성하지 않았다.

오류 목록 창에서 오류 메시지를 선택하고 F1 키를 눌러 링커 또는 컴파일러 오류에 대한 도움말을 볼 수 있습니다.

+0

하지만 두 생성자를 병합 한 것은 합법적이라고 사람들이 말합니다. –

+0

이들을 병합 할 수는 있지만 클래스 정의에서'Complex();'를 선언해서는 안됩니다. 'Complex (float, float); 만 선언하고 매개 변수의 기본값을 제공하십시오. –

0

함수 정의에서 기본 매개 변수를 제공 할 수 없습니다. 함수 선언시이를 수행해야합니다. 대신 두 개의 생성자를 선언, (사람이 너무 막연 오류 메시지에 대한 설명이 왜 이해가 안 기본값을 제거, 당신의 정의에서 다음

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

처럼 하나를 선언, 그래서

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

당신이 옳습니다. 그러나 기본 생성자 정의를 추가 한 후에 리눅스에서 g ++로 컴파일되었습니다. 심지어 '-pedantic' 플래그도 포함되어 있습니다. Weird. –

+1

그건 완전히 사실이 아닙니다. 함수 정의에서 기본 매개 변수를 지정하는 것은 선언에서 지정되지 않은 경우에 완벽하게 유효합니다. [C++ 함수의 기본 인수] (http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr237)를 확인할 수 있습니다. .htm) 자세한 내용은. –

+0

이 개념을 혼동합니다. 내가 두 생성자를 병합 할 수 있는지 여부 ?? –

1

된다 말하자면 "링커 오류"로) 오류 메시지를 복사하여 붙여 넣지 않아도됩니다. 즉, 다음과 같이 변경하여 리눅스에서 프로그램을 컴파일하고 링크 할 수있었습니다.

1) 복잡한 프로그램의 클래스 정의를 header_complex.h이라는 헤더 파일로 옮겼습니다. 메인 프로그램 #include입니다. 내가 명령 줄에 -lstdc++을 추가

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

3) :

2) 나는 기본 생성자에 대한 정의 추가 그런데

gcc complex.cpp -lstdc++ 

을, 당신이가는 것 같아요 일부 endl의 추가하여 표시 방법을 수정할 :

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

EMM을 ... 참조

Complex c1; // here's the error - you have no defined Complex::Complex() {} method 
관련 문제