2012-05-07 13 views
2

クラス宣言の前にマクロを定義しています。マクロはクラスのメンバ関数を呼び出します。私のサンプルコードは以下の通りです。私はmain.cppにを実行するとクラス宣言前のクラスのメンバ関数を呼び出す

Sampleクラスの宣言、

// 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クラスの実装、

//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; 
} 

、私は、エラーを取得していますマクロ定義内のsample.hファイル: "Sample"はクラスまたは名前空間名ではありません。

クラスのメンバー関数をクラスのスコープの外で、クラス宣言の前に呼び出すにはどうすればよいですか?私はプログラミングに新しく、あなたのフィードバックは私に役立つでしょう、ありがとう。

答えて

4

あなたは複数行にまたがるするマクロをしたい場合は、各行の末尾に\を配置する必要があります:

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

また、なぜあなただ​​けの使用このために関数を使用する(とはしません。 stringstream)?

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 OK、実験には何も間違っていません:)これは実際のコードの場合に備えて指摘したかったのです。 –

+1

そして、 '\'の後ろに空白を入れないでください。同じ問題に終わるでしょう。それは、改行ではなくスペースから脱出するでしょう。おかげさまで –

0

あなたは{でプリプロセッサで交換するを定義した後、非常に違法であるグローバル空間コーディング、の束と、それに続いてきました。

プリプロセッサマクロのチュートリアルやインライン関数の読み上げに戻ってみることをお勧めします。

+0

あなたは私にグローバルな空間コーディングに関するいくつかの情報を与えてもらえますか?私はその言葉を手に入れませんでした。 –

+0

@capricorn_heitus彼は、マクロがその最初の行にあるだけなので、コンパイラは関数の外で計算をしようとしていることを意味します(Pythonなどでできるように、ファイルの_top-level_にあります)。あなたはC++で行うことはできません。それとあなたには迷いがあります。 –

+0

@SethCarnegieありがとう、私は今それを得た。だから、これに対する解決策はマクロを複数の行にまたがって '\'で囲むことについての答えでした。これはマクロ定義内の計算を正しく行いますか? @capricorn_heitus正確には –

2

私は他にも問題があると考えています。 Sample :: getTempIncrement()は静的として宣言されていないため、マクロで使用できるSampleインスタンスが必要です。

+0

良いキャッチ、+1。 –

関連する問題