2012-05-07 5 views
2

클래스 선언 앞에 매크로를 정의하려고합니다. 매크로는 클래스의 멤버 함수를 호출합니다. 내 샘플 코드는 아래와 같습니다.클래스 선언 이전 클래스의 멤버 함수 호출

샘플 클래스 선언,

// sample.h 

#include <sstream> 
#include <iostream> 
using namespace std; 

#define CALCULATETEMP(a, b, c) { 
int d = Sample::getTempIncrement(a,b,c); 
stringstream ss; 
ss << d; 
cout << ss.str() << endl; 
} 

class Sample { 
public: 
    Sample(); 
    int getTempIncrement(int a, int b, int c); 
    ~Sample(); 
}; 

샘플 클래스 구현,

//sample.cpp 

#include "sample.h" 
Sample::Sample() { 
} 

int Sample::getTempIncrement(int a, int b, int c) { 
    int temp = 5; 
    int d = (a*temp) + (b+c)*temp; 
    return d; 
} 

Sample::~Sample() { 
} 

메인 루틴,

//main.cpp 

#include "sample.h" 

int main(int argc, char* argv[]) { 
    int a = 1; 
    int b = 2; 
    int c = 3; 
    CALCULATETEMP(a, b, c); 
    return 0; 
} 

나는 MAIN.CPP을 실행

, 나는 오류가 무엇입니까 매크로 정의 내의 sample.h 파일 : "Sample"은 클래스 또는 네임 스페이스 이름이 아닙니다.

클래스의 범위 밖에서 클래스 선언 이전에 클래스의 멤버 함수를 어떻게 호출 할 수 있습니까? 나는 프로그래밍에 아주 익숙하다. 당신의 피드백은 나를 도울 것입니다. 고마워요. 또한

#define CALCULATETEMP(a, b, c) {   \ 
int d = Sample::getTempIncrement(a,b,c); \ 
stringstream ss;       \ 
ss << d;         \ 
cout << ss.str() << endl;    \ 
} 

, 왜 당신은 그냥 사용이하는 기능을 사용 (하지 않는 : 매크로 여러 줄에 걸쳐하려면

답변

4

, 각 행의 끝에서 \을 넣어야 할 stringstream)? 당신은 CALCULATETEMP(a,b,c)을 정의한

class Sample { 
public: 
    Sample(); 
    int getTempIncrement(int a, int b, int c); 
    ~Sample(); 
}; 

void calctemp(int a, int b, int c) { 
    int d = Sample::getTempIncrement(a,b,c); 
    stringstream ss; 
    ss << d; 
    cout << ss.str() << endl; // why are you using stringstream? It could be 
           // just cout << d << endl; 
} 
+0

예, 'stringstream'이 약간의 오버 헤드였습니다. 감사합니다. 나는 단지 매크로를 시도하고 있었고, 함수를 사용하지 않는 것에 대해서는 특별한 것이 없었다. –

+0

@capricorn_heitus 좋습니다, 실험에 아무 문제가 없습니다.이 코드가 어딘가에있는 경우에 대비하여 필자는 이것을 지적하고 싶었습니다. –

+1

그리고 '\'다음에 공백을 두지 마십시오. 그렇지 않으면 같은 문제가 발생합니다. 그것은 개조보다 공간을 벗어날 것입니다. –

0

{와 전처리로 대체하고 꽤 불법 글로벌 공간 코딩의 무리와 함께 그것을 따라야합니다.

선처리 매크로에 대한 지침서로 돌아가거나 인라인 함수를 읽는 것이 좋습니다.

+0

감사합니다. 글로벌 우주 코딩에 대한 정보를 주시겠습니까? 나는 그 용어를 얻지 못했습니다. –

+0

@capricorn_heitus 그는 매크로가 첫 번째 줄에만 있기 때문에 컴파일러는 함수 밖에서 계산을하려고한다는 것을 의미합니다 (파이썬 등에서 할 수있는 것처럼 파일의 _top-level_에서). C++에서는 할 수 없습니다. 그것과 당신은 길잃은'}'. –

+0

@SethCarnegie 감사합니다. 지금 받으 셨습니다. 그래서 이것에 대한 해결책은 '\'를 사용하여 매크로를 여러 줄로 확장하는 것에 대한 대답이었습니다. 매크로 정의 내에서 계산이 이루어졌습니다. –

2

다른 문제가 있다고 생각합니다. Sample :: getTempIncrement()는 정적으로 선언되지 않으므로 매크로에서 사용할 수있는 Sample 인스턴스가 필요합니다.

+0

좋은 걸, +1. –

관련 문제