2016-04-17 5 views
-1

私はCでオブジェクト指向プログラミングをしようとしています。私が抱えていることの1つは、渡された引数の数に基づいて機能します。理由は分かりませんが、3つのパラメータを渡すと、contructor1が呼び出されます。引数の数に基づいて関数のオーバーロードを達成しようとしましたが、型ではありません

EDIT:が追加され、構造体の定義が追加されました。コードはコンパイル可能です。

#include <stdint.h> 
#include <stdio.h> 
#include <stdlib.h> 

typedef struct my_type_struct my_type; 

void constructor1 (my_type * object, uint16_t arg1); 
void constructor2 (my_type * object, uint16_t arg1, uint16_t arg2); 
void constructor3 (my_type * object, const void * const array_arg1, 
    uint16_t arg2, uint16_t arg3); 

#define GET_CONTRUCTOR_OVERLOAD(_1, _2, _3, NAME, ...) NAME 
#define INIT_OBJECT(...) GET_CONTRUCTOR_OVERLOAD(__VA_ARGS__, \ 
    constructor3, constructor2, constructor1)(__VA_ARGS__) 
#define CONSTRUCTOR(name, ...) my_type name; INIT_OBJECT(&name, __VA_ARGS__) 

struct my_type_struct 
{ 
    int field; 
}; 

int main(int argc, char* argv[]) 
{ 
    int a[30]; 
    CONSTRUCTOR(obj, a, sizeof(int), 30);//invokes constructor1 
} 

void constructor1 (my_type * object, uint16_t arg1) 
{ 
    printf("%s\n", __FUNCTION__); 
    object->field = 1; 
} 
void constructor2 (my_type * object, uint16_t arg1, uint16_t arg2) 
{ 
    printf("%s\n", __FUNCTION__); 
    object->field = 2; 
} 
void constructor3 (my_type * object, const void * const array_arg1, 
uint16_t arg2, uint16_t arg3) 
{ 
    printf("%s\n", __FUNCTION__); 
    object->field = 3; 
} 

誰でもこれを正しく行う方法を知っていますか?

+0

これは私にLILE X/Yの問題をにおいがします。これを行う正当な理由はありますか?直接電話をかけるより読みやすいですか?これをそのままの形でサポートする言語を使用するよりもメンテナンスは容易ですか? –

+2

これはデバッグの悪夢のようです。これは、コンパイラからの型チェックも禁止するので、さらに悪化します。明確なアドバイス:** **はしないでください。異なるパラメータによる関数名のオーバーロードは、OOPでは必須ではなく、すべての(真の)OOP言語でサポートされていません。 – Olaf

+0

@Olafそれは私が知っているすべてのOOP言語(Java、C++、C#)でサポートされています。私がアマチュアでコンピュータサイエンスで正式な教育を受けていないので、彼らが本当のOOP言語であるかどうかは分かりません。ただコーディングが大好きです。 – FinnTheHuman

答えて

1

変更GET_CONTRUCTOR_OVERLOADに、4つの引数を処理し、正しい機能を選択することができますので:

#define GET_CONTRUCTOR_OVERLOAD(_1, _2, _3, _4, NAME, ...) NAME 

は、ここでは、アクションでそれを参照してください:https://ideone.com/5Iobu1

+0

これを行うと、コンストラクタはまったく呼び出されません。 – FinnTheHuman

+0

@FinnTheHumanここでどの機能が呼び出されましたか:https://ideone.com/yj5rK3? – 2501

+0

constructor1が呼び出されました。 – FinnTheHuman

関連する問題