2010-10-05 6 views
2

Est-ce bien si je suis « membres imbriqués » dans le langage D, donc je l'idée déshonorante au codeEspaces de noms avec classes et structs?


class Keyboard 
{ 
    struct Unused { 
     string key1 = "Wake Up"; 
     string key2 = "Sleep"; 
     string key3 = "Power"; 
    } 

    Unused unused; 
} 

int main() 
{ 
    Keyboard kb; 
    kb.unused.key1 = "Scroll Lock"; 

    return 0; 
} 

D'accord, c'est un mauvais exemple que trop segmentation fault. Mais j'apprends la programmation orientée objet et je ne sais pas si c'est une bonne chose à faire ou à faire.

Répondre

3

Il n'y a rien de mal à le faire en tant que tel , le problème ici est que kb est encore null. Vous devez créer un objet Keyboard:

Keyboard kb = new Keyboard(); 

Si vous ne voulez pas taper deux fois Keyboard, vous pouvez utiliser auto:

auto kb = new Keyboard(); 

Et D détermine automatiquement le type correct pour vous.

Il est assez commun de regrouper des objets connexes comme ceci dans une structure, bien que généralement vous vouliez un nom plus descriptif que Unused (sinon, pourquoi avoir l'espace de noms?).

+0

C'est une honte! Y a-t-il une différence entre exécuter le programme de l'auto au clavier, ou est-ce la même chose une fois compilé? –

+0

C'est exactement la même chose: le compilateur peut voir que 'new Keyboard()' renvoie un 'Keyboard' à la compilation et ajoute simplement le type lui-même. Il n'y a pas de différence dans le code compilé. –

+1

@pslacerda, elle est appelée inférence de type et utilisée partout dans D. foreach (w; words), sort (words); Même trier ici a une inférence. La longueur totale de l'appel serait trier! (Immutable (char) [] [], "a

2

Vous pouvez utiliser la syntaxe suggérée en premier. Juste rendre inutilisé un membre statique. Cela fonctionne bien:

class Keyboard 
{ 
    struct Unused { 
     string key1 = "Wake Up"; 
     string key2 = "Sleep"; 
     string key3 = "Power"; 
    } 

    static Unused unused; // **This is now a static member** 
} 

int main() 
{ 
    Keyboard kb; 
    kb.unused.key1 = "Scroll Lock"; 

    return 0; 
} 
+0

N'est-ce pas le cas ... –

Questions connexes