2015-03-08 3 views
0

Я нахожусь в ситуации, когда у меня есть файл C++ с помощью макроса, который генерирует несколько функций на лету:Объявить методы C++ вне класса?

#define FUNC_GEN(x,y,z) \ 
int x(int arg1, float arg2) \ 
{ \ 
    .... \ 
} \ 
\ 
int y(int arg1, int arg2, int arg3) \ 
{ \ 
    .... \ 
} \ 
\ 
double z(int arg1, float arg2) \ 
{ \ 
    .... \ 
} \ 

FUNC_GEN(func1,func2,func3) // Hundreds of these 

Это создает что-то вроде:

int func1(int arg1, float arg2) 
{ 
    .... 
} 

int func2(int arg1, int arg2, int arg3) 
{ 
    .... 
} 

double func1(int arg1, float arg2) 
{ 
    .... 
} 

У меня есть сотни этих разбросанных по всему файлу. То, что я хотел бы сделать, это изменить FUNC_GEN, чтобы создать сгенерированные функции для определенного класса. Проблема в том, что я понимаю, что функции должны быть объявлены с помощью определения класса. Поскольку это фактически создает функции «на лету», это непросто вставить в определение класса.

Есть ли способ в C++ изменить этот макрос, чтобы сделать эти методы членами класса? Я знаю только один способ (тот, которого я избегаю), который должен выслеживать все эти макросы и вручную добавлять их к определению класса.

Мой наивный подход должен был сделать это:

#define FUNC_GEN(x,y,z) \ 
private int myclass::x(int arg1, float arg2) \ 
{ \ 
    .... \ 
} \ 
\ 
private int myclass::y(int arg1, int arg2, int arg3) \ 
{ \ 
    .... \ 
} \ 
\ 
private double myclass::z(int arg1, float arg2) \ 
{ \ 
    .... \ 
} \ 

Но поскольку они не объявлены с классом, компилятор отказывается позволить, что сборка («Ошибка: класс не имеет ни одного члена»).

+4

Есть причина, почему вы не можете просто вызвать макрос внутри определения класса? Во всяком случае, это плохо пахнет, ИМХО. –

+0

В чем причина этого, что он достиг? –

+3

_ «У меня есть сотни из них, разбросанных по всему файлу» _ wooooooah почему? –

ответ

1

Может быть, самым простым решением является определение функции внутри класса:

class myclass 
{ 
    private: 
    FUNC_GEN(func1,func2,func3) // Hundreds of these 
}; 
+0

Кажется, что ответ OP уже знает и хочет избежать: «выслеживайте все эти макросы и вручную добавляйте их к определению класса». – rici

+1

Пожелания не меняют языковые правила. –

0

Объявления для всех функций членов необходимо быть включены в определение класса. Вы можете:

  • определить функции внутри объявления класса с помощью макроса или

  • создать еще один макрос, который будет только декларировать функции, но не определять их, и положить, что в объявлении класса.

+0

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

0

Определения методов класса могут быть вне любого класса. Когда вы определяете метод класса вне класса, вам нужно префикс имени метода с именем класса и оператором разрешения области.

Важной частью является не использовать ключевые слова, круг доступа, такие как private, protected или public.

Вот пример:

class Kitten 
{ 
    public: 
    void run(); 
    void hiss(); 
}; 

void Kitten::run() 
{ 
    //... 
} 

void Kitten::hiss() 
{ 
    //... 
} 
Смежные вопросы