2016-12-29 4 views
-1

Предположим, у меня есть функция drawImage, которая принимает много аргументов, некоторые из них имеют типы WinApi, такие как HWND, HDC и так далее; и я не хочу импортировать все из них в заголовок класса. Но мне нужно вызвать это из методов моего класса.Как объявить и вызвать функцию с неизвестными аргументами?

extern void drawImage(); 

class A { 
private : 
    int n; 
    // ... 
public : 
    // ... 
    void draw() { 
     drawImage(n); 
    } 
}; 

Приведенный выше код дает мне ожидаемую ошибку: drawImage does not take one argument. Итак, как я мог достичь этого?

Кроме того, я не хочу определять свою функцию-член в исходном файле, который содержит материал WinApi.

UPDATE:

extern void drawImage(); 
extern int a; 
extern unsigned long int b; 
... 
extern "C" void c; 
class A{ 
     private : 
     int n; 
     ... 
     public : 
     ... 
     void draw(a,b,c){ 
     drawImage(a,b,c,n); 
     } 
} 

Это может сделать большое решение, но Visual Studio не позволяет extern void декларации.

+0

Вы хотите вызвать функцию, которая не принимает один аргумент с одним аргументом; почему вы ожидаете, что это сработает? * Как бы ожидать, что это сработает? –

+0

thats мой вопрос, какая-то волшебная C++ вещь, позволяющая такую ​​гибкость в коде, как символические args: 'draw (a, b, c, d)' –

+0

Как правило, и в этом случае ожидание «магии» оставит вас разочарованный. –

ответ

2

Просто укажите void A::draw() вне сети, в .cpp-файле (например, A.cpp).
Здесь вы можете включить полную декларацию drawImage и удалить ее из A.h.


Если этого недостаточно, то есть, вы хотите, чтобы полностью отделить материал WinAPI от вашего кода, вы просто должны пойти один шаг дальше. Ваш A.cpp будет выглядеть примерно так:

#include "A.h" 

namespace winapi { 
    // Wrapper function for WinApi's drawImage, 
    // with the parameters we actually care about 
    void apiDrawImage(int, unsigned long, int); 
} 

void A::draw(int a, unsigned long b) { 
    apiDrawImage(a,b,n); 
} 

Тогда вы бы реализовать winapi::drawImage в еще одном файле .cpp, скажем winapi.cpp:

// Declares the actual drawImage() function 
#include <WinApiStuff.h> 

namespace winapi { 
    void apiDrawImage(int a, unsigned long b, int n) { 
     // Forward to WinApi 
     ::drawImage(/* ... */); 
    } 
} 

winapi.cpp И тогда будет единственный файл, чтобы узнать о WinApi ,

Бонусная точка: если вы скомпилируете и связываетесь с включенным LTO (-flto для GCC и Clang), все это может быть встроено в единицы перевода и в конечном итоге без накладных расходов!

+0

, это было бы моим последним приложением, но я надеялся не смешивать чистый код WINAPI с чистым кодом C++ –

+0

спасибо, что я закончил использование: 'void print (void * a, int b, int c) { \t \t drawImage (а, б, в, число); \t} 'намного проще :) –

+0

@NeoMosaid Я не уверен, что« проще », кроме отсутствия пространства имен, но до тех пор, пока оно вам подходит ... :) – Quentin

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