2012-05-13 18 views
1

構造体の名前を引数とする関数を作成したい場合、メソッドの署名はどのように見えますか?構造体の名前のデータ型は何か

typedef struct Class{ 
} Class; 

main() 
{ 
    Class *a = malloc(Class); 
    return instanceOf(a, Class); 
} 

instanceOfの宣言はどのように見えるのでしょうか?

+1

私はあなたがさえてC. –

答えて

6

あなたはしかし、あなたがマクロを使用してこの動作をシミュレートすることができますCの関数に型を渡すことはできません。

#define new_instance(t) (malloc(sizeof(t))) 

Class *instance = new_instance(Class); 
+0

でそれを行うことができるとは思いませんタイプキャスト?私はそれらをvoidポインタにキャストすることについて[ここ](http://www.planetpdf.com/codecuts/pdfs/ooc.pdf)を読んでいます。コンパイラは常にエラーを出すか、識別子 "Class"をどこかへのポインタにキャストすることができますか? –

+2

いいえ、あなたは引数として型にパスすることはできません。 –

+1

@DavidNathanこのドキュメントで説明されているアプローチは、型/構造体名を値として渡しません。クラスを表す値(構造体型のもの)を作成し、クラスを渡します。 H2CO3によると、関数の引数として型を渡すことはできません(または変数を変数に格納するか、値が使用される他のコンテキストで使用することはできません)。 – sepp2k

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define type(x) #x 

typedef struct Class{ 
    char* type; 
} Class; 

Class *Class_new(){ 
    Class *v; 
    v=(Class*)malloc(sizeof(Class)); 
    v->type = "Class"; 
    return v; 
} 

void Class_free(Class *a){ 
    free(a); 
} 
int instanceOf(Class *a, const char* type){ 
    return strcmp(a->type, type) == 0; 
} 

int main(){ 
    Class *a = Class_new(); 
    printf("%s\n", instanceOf(a, type(Class)) ? "YES" : "NO"); 
    Class_free(a); 
    return 0; 
} 
関連する問題