2016-12-29 8 views
-1

私はたくさんの引数を取る関数drawImageを持っていて、そのうちのいくつかはHWNDHDCのようなWinApiタイプのものです。クラスのヘッダーにすべてインポートする必要はありません。しかし私はクラスのメソッドから呼び出す必要があります。未知の引数を持つ関数を宣言して呼び出す方法は?

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

引数が1つではない関数を呼び出す場合は、なぜあなたはそれが働くことを期待していますか? *どのように働くことが期待されますか? –

+0

これは私の質問です。シンボリックなargsのようなコードに柔軟性を持たせるためのいくつかの魔法のC++の事: 'draw(a、b、c、d)' –

+0

原則として、この場合、 "magic"失望した。 –

答えて

2

void A::draw()を.cppファイル(たとえば、A.cpp)で行外定義するだけです。
drawImageの完全な宣言を含めることができ、その包含をA.hから削除することができます。


これでは不十分な場合、つまりWinApiのコードとコードを完全に分離したい場合は、さらに進んでいく必要があります。 、そして、あなたはまだ別の.cppファイルでwinapi::drawImageを実装したい

#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.cppを言う:あなたのA.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が有効になっている場合(GCCとClangの場合は-flto)、これらはすべて翻訳単位にインライン化され、オーバーヘッドが全くありません。

+0

これは私の最後の手段ですが、純粋なWINAPIコードと純粋なC++コードを混ぜることは避けたいと考えています。 –

+0

私は結局私が使い終わったことを感謝します: 'void print(void *、int b、int c){ \t \t drawImage a、b、c、数字); \t} 'はるかに簡単です:) –

+0

@NeoMosaid名前空間の欠如とは別に、もっと簡単なことはわかりませんが、それがあなたに合っている限り... :) – Quentin

関連する問題