2013-03-26 3 views
0

나는 정수 계산기를 쓰고있다. function.h.cpp 파일에있는 함수 클래스에서 함수를 읽도록 main.cpp 파일을 가져 오려고합니다. 나는 쉬운 경우C++ 메인의 헤더 파일에서 함수 호출하기

double square(double aX) 
{ 
    return aX*aX; 
} 
에 대해 다음과 같이 정의 된 함수가

이 함수는 내가하려고 할 때 작업 때 주 파일에서 호출하고 싶지 않지만 내가 주 파일에 포함 할 때 작동 함수 파일에 있습니다. 여기에 내가 가진 코드가 있습니다.

이 내 Main.cpp 파일입니다

#include <iostream> 
#include "IntegralCalculator.h" 
#include "functions.h" 

using namespace std; 

int main() 
    { 
    IntegralCalculator Function(square); 
    Function.print(); 
    } 

당신이 볼 수 있듯이, 실제로 적분의 계산을 수행 적분 계산기라는 다른 클래스는이 때를 작동하기 때문에 아무것도 그 문제 없어야하지만,이 함수 정의가 main에 포함되어 있고 함수가 매개 변수로 전달됩니다. 같은

#ifndef FUNCTIONS_H 
#define FUNCTIONS_H 

#include <iostream> 
#include <cmath> 
#include "IntegralCalculator.h" 


class functions : public IntegralCalculator 
{ 
    public: 
    functions(); 
    double square(double aX); 

}; 

#endif 

functions.cpp 파일이 정의된다 : :이 functions.h 파일은 다음과 같이 정의된다

#include <iostream> 
#include <cmath> 
#include "functions.h" 


double functions::square(double aX) 
{ 
    return aX*aX; 
} 

은 내가 비록 지금의 나는이의 <cmath> 라이브러리를 필요로하지 않는다는 것을 알고있다 그것들을 추가 할 때 더 복잡한 함수를 필요로 할 것입니다.

주 기능 클래스를 상속 한 시도하고 함수 클래스 및 함수를 정의하는 네임 스페이스를 만들려고했지만 이들 중 아무 것도 작동하지 않았습니다. 내가 컴파일 갈 때, 나는 다음과 같은 오류가 발생합니다 : 누군가가 나이 문제를 알아내는 데 도움이 바랍니다 수

Main.cpp: In function ‘int main()’:

Main.cpp:9: error: ‘square’ was not declared in this scope

합니다. 필자가 작성하려고하는이 코드는 클래스가 끝난 것보다 훨씬 앞선다. 그래서이 방법으로 프로그램을 작성하고 싶지만 어떻게 수정해야할지 모르겠다.

고맙습니다.

편집 : 궁금한 점이 있으시면 functions.hfunctions.cpp 파일을 Makefile에 포함시키고 자합니다. IntegralCalculator 클래스에 square(double aX) 정의를 넣으려고 할 때도 같은 오류가 발생했습니다. 같은 오류.

+0

'functions.h'에'double square (double aX)'를 선언 했습니까? – Kyurem

+0

'functions.h' 파일이있는 섹션을 보면 알 수 있습니다. – Cmertin

+0

귀하의 문제는 함수 클래스에서 square 함수를 선언하여 멤버 함수로 만드는 것으로 보입니다. double function :: square (double ax) {...}로 선언해야합니다. –

답변

3

문제는 square은 AKA 메소드의 멤버 함수입니다. 즉, square이라는 일반 기호가 없으면 functions::square입니다. 정적 메서드가 아니기 때문에 아무 의미가 없습니다. 항상 가지고있는 객체 인스턴스가 필요합니다. IntegralCalculator은 사용하지 않아도됩니다.

3 솔루션은 간단한의 순서, 질문, 제일에 가장 가까운 :

: 생성자 delcaration에서


는 그것을 글로벌 기능을하기 위해선, 클래스 밖으로 square 이동 기능 있음.어떻게 것입니다

IntegralCalculator Function(square); 

또는 수 있도록 그것은 정적 메소드 (: MAIN.CPP에서

functions.cpp에서
double square(double aX); 

double square(double aX) { 
    return aX*aX; 
} 

사용법 : 모든 클래스 외부 시간 Java와 같은 언어를 사용하면 "알몸"함수는 허용되지 않지만 실제로 C++이 아닙니다.)

class functions // inheriting IntegralCalculator removed as not needed 
{ 
    public: 
    static double square(double aX); 
}; 

및 functions.cpp에

가 :

//static 
double functions::square(double aX) { 
    return aX*aX; 
} 

그런 다음 당신이 MAIN.CPP에서 기능 생성자`이처럼 전달할 수 있습니다

IntegralCalculator Function(functions::square); 
을 functions.h에


마지막으로, 아마도 최상의 솔루션 일 것입니다. bove : square을 네임 스페이스에 넣습니다. 그래서 functions.h가 functions.cpp이

namespace functions { 
    double square(double aX) { 
     return aX*aX; 
    } 
} 

당신은 여전히 ​​같은 주에서 사용된다

namespace functions { 
    double square(double aX) 
} 

된다 :

IntegralCalculator Function(functions::square); 
0

을들 :

class functions : public IntegralCalculator 
{ 
    public: 
    functions(); 
    double square(double aX); 

}; 

하는 괜찮아요.하지만 그 밖의 다른 cpp 파일들에 대해서는 말하지 않습니다. functions.cpp 파일의 어딘가에 square라고하는 전역 함수가 있습니다. 당신이 사용할 수있는 완전히 귀하의 질문에 관련이없는,하지만 생성자 코드를보고 난 후에 언급 할 가치 또한

double square(double ax); 
class functions : public IntegralCalculator 
{ 
    public: 
    functions(); 
    double square(double aX); 

}; 

: 당신이해야 할 것은 컴파일러가 존재 함을 알 수 있도록 해당 기능의 헤더를 포함입니다 타입 정의는과 같이 함수 포인터를 선언합니다 : 생성자가 지금은 청소기가의

IntegralCalculator::IntegralCalculator(IntegralFunctor func); 

수 있습니다

typedef double (IntegralFunctor*)(double); 

그래야 이 방법을 덜 혼란스럽게한다.