2010-12-15 146 views
0

J'ai la structure (A) et il faut une autre structure (B) comme élément. Maintenant, je veux la structure C en tant que membre de A au lieu de B. Les deux B et C sont de même typeType de coulée d'un élément de structure

typedef struct 
{ 
int a; 
B b; 
}A 

typedef struct 
{ 
int a; 
}B 

typedef struct 
{ 
int a; 
}C 

Comment puis-je attribuer struct C en tant que membre au lieu de B. Comment faire transtypage S'il vous plaît aider

+0

Etes-vous à la recherche d'un moyen d'échanger les données de membre struct sur runtime? –

+0

Non je veux passer ma propre structure à struct A ou besoin de C comme membre par typage – Sijith

+0

Quand vous dites que B et C sont du même type, voulez-vous dire qu'ils héritent de quelque chose ou qu'ils contiennent le même type de données? – slycrel

Répondre

1

Sans savoir pourquoi vous voulez faire cela, il est difficile de recommander une stratégie. Voici quelques options cependant.

Option 1: Utiliser des modèles. (C++ uniquement)

template <type T> 
struct A 
{ 
    int a; 
    T* t; 
}; 

struct Foo 
{ 
    int a; 
}; 

struct B : public Foo 
{ 
}; 

struct C : public Foo 
{ 
}; 

struct A<Foo> A_foo; 

struct B; 
struct C; 

A_foo.t = &B; //OK! This can now take pointer to any class that extends Foo. 
A_foo.t = &C; //OK! 

Option 2: Faire struct A contient un * vide (non recommandé, vous perdrez toute sécurité de type). (Les deux C/C++)

struct A 
{ 
    int a; 
    void* foo; // you can now assign any pointer to foo :-S 
}; 
+0

Le message a été étiqueté C++. Merci pour le commentaire, j'ai clarifié mon message! –

1

C et C++ sont des langages typés statiquement. Tu ne peux pas le faire. Si vous déclarez quelque chose comme une pomme, il restera comme une pomme jusqu'à la fin des temps.

1

Bien qu'ils semblent être du même type (et sont, dans ce cas simple, identiques), ils sont considérés comme des types différents par le compilateur. Cela a du sens pour les cas plus complexes ou en C++ où le système de type est plus complexe que le C. pur

Vous ne devriez généralement pas vous fier aux astuces du compilateur ou au hackery pour effectuer ce type d'affectation. Au lieu de cela, faites-le correctement. Soit assigner directement des champs ou, pour simplifier le code, créez une fonction d'assistance le long de ces lignes:

void ASetBWithC(A *a, C c) { 
    assert(a != NULL); 
    a->b.a = c.a; 
} 

C++ a également l'opérateur d'affectation que vous pouvez surcharger pour faire votre travail pour vous (au lieu de créer une fonction d'assistance nommée) mais je soupçonne que c'est au-delà de votre niveau de confort actuel.