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 ファイルでエラーが発生します。「サンプル」はクラスまたは名前空間の名前ではありません。

クラスのスコープ外でクラス宣言の前にクラスのメンバー関数を呼び出すにはどうすればよいですか? 私はプログラミングにまったく慣れていません。あなたのフィードバックは私を助けてくれます、ありがとう。

4

3 に答える 3

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;
}
于 2012-05-07T19:44:23.827 に答える
2

また、別の問題があると思います。Sample::getTempIncrement() は static として宣言されていないため、マクロで使用可能な Sample インスタンスが必要になります。

于 2012-05-07T22:09:44.863 に答える
0

CALCULATETEMP(a,b,c)プリプロセッサによって置き換えられるように定義し{、その後に一連のグローバル空間コーディングを続けましたが、これは非常に違法です。

プリプロセッサ マクロのチュートリアルに戻るか、インライン関数を読むことをお勧めします。

于 2012-05-07T19:44:32.933 に答える