2012-05-07 6 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,

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

Если вы хотите, чтобы макрос из нескольких строк, вы должны поставить \ в конце каждой строки:

#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

Да, «струнный поток» был там наверху, спасибо. Я просто пытался использовать макросы, ничего особенного в том, что я не делаю этого с помощью функции. –

+0

@capricorn_heitus ОК, ничего плохого в экспериментировании :) Я просто хотел указать на это, если бы это был настоящий код где-то. –

+1

И помните, не оставляйте пробелы после «\», иначе у вас будет та же проблема. Это позволит избежать пространства, а не любых новых строк. –

0

Вы определили быть заменен препроцессором с {, а затем последовал за ним с кучей глобального пространства кодирования, которая является весьма незаконным.

Я бы предложил вернуться к руководству по макросам препроцессора и/или прочитать встроенные функции.

+0

Спасибо. Не могли бы вы дать мне некоторую информацию о глобальном космическом кодировании, я не получил этого термина. –

+0

@capricorn_heitus он означает, что, поскольку макрос находится только в этой первой строке, компилятор считает, что вы пытаетесь выполнить вычисления вне функции (на уровне _top-level_ файла, как вы можете сделать на Python или что-то еще), что вы не можете сделать в C++. Это, и у вас есть бродячие '}'. –

+0

@SethCarnegie спасибо, я получил его сейчас. Итак, решение этого было вашим ответом о том, чтобы охватывать макросы до нескольких строк с помощью «\», что делает вычисления в определении макроса, правильно? –

2

Я считаю, что есть еще одна проблема. Образец :: getTempIncrement() не объявляется как статический, поэтому вам понадобится экземпляр Sample, доступный в макросе.

+0

Хороший улов, +1. –

Смежные вопросы