私は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;
}
誰でもこれを正しく行う方法を知っていますか?
これは私にLILE X/Yの問題をにおいがします。これを行う正当な理由はありますか?直接電話をかけるより読みやすいですか?これをそのままの形でサポートする言語を使用するよりもメンテナンスは容易ですか? –
これはデバッグの悪夢のようです。これは、コンパイラからの型チェックも禁止するので、さらに悪化します。明確なアドバイス:** **はしないでください。異なるパラメータによる関数名のオーバーロードは、OOPでは必須ではなく、すべての(真の)OOP言語でサポートされていません。 – Olaf
@Olafそれは私が知っているすべてのOOP言語(Java、C++、C#)でサポートされています。私がアマチュアでコンピュータサイエンスで正式な教育を受けていないので、彼らが本当のOOP言語であるかどうかは分かりません。ただコーディングが大好きです。 – FinnTheHuman