7
votes

Les pointeurs sont-ils possibles à différents types de pointeurs dans C ++?

sont un éventail de pointeurs à différents types possibles dans C ++? avec exemple s'il vous plaît)


0 commentaires

7 Réponses :


3
votes

... si vous utilisez un vide *, c'est facile; -)


3 commentaires

pouvez-vous donner petit exemple?))


et conduire à des situations potentiellement explosives!


char * c_string = "bonjour monde"; MyCplusplusclass * obj = nouveau myCplusPlusclass (); vide * somerray [] = {c_string, obj}; Si bien sûr, vous feriez bien mieux de mieux se souvenir de ce que c'est quoi. :-)



16
votes

Habituellement si vous souhaitez avoir une collection de "types" différents des pointeurs, vous la mettez en œuvre d'une manière où elles dérivent une classe / une interface de base et stocker un pointeur sur cette base. Puis, par polymorphisme, vous pouvez les faire se comporter comme des types différents.

class Base
{
public:
    virtual void doSomething() = 0;
};

class A : public Base
{
    void doSomething() { cout << "A\n"; } 
};

class B : public Base
{
    void doSomething() { cout << "B\n"; } 
};

std::vector<Base*> pointers;
pointers.push_back(new A);
pointers.push_back(new B);


2 commentaires

J'aime cette réponse. J'ajouterais que vous pouvez également interroger quel type est celui de dynamique, à l'aide de dynamic_cast ... bien que certains argumenteraient que c'est une mauvaise chose. :-)


@ASVEIKAU: A dynamic_cast est, fondamentalement, un commutateur sur les types sur les types. Et la commutation des types est juste un signe de peur (irrationnel) de polymorphisme. Lorsque vous êtes tenté de le faire, utilisez plutôt des fonctions virtuelles.



1
votes

oui; Je viens de jeter vos indicateurs dans le tableau à tout type que vous souhaitez qu'ils se réfèrent.

alternativement, vous pouvez faire votre tableau un tableau d'un syndicat (avec les éléments syndicaux étant les types de pointeur différents).


0 commentaires

8
votes

Un éventail de pointeurs à vide a déjà été mentionné. Si vous voulez le rendre pratique et utile, envisagez d'utiliser un tableau (ou mieux, vecteur) de boost :: n'importe quel .


0 commentaires

7
votes

C ++ est C avec plus de choses. Donc, si vous voulez le faire, le type C, comme ci-dessus, vous faites simplement une gamme de pointeurs de vide xxx

da.

Si vous voulez faire des choses l'objet orienté objet Way, alors vous voulez utiliser une collection et que tout ce que vous allez ajouter à la collection dérive de la même classe d'objet de base pouvant être ajoutée à la collection. En Java, il s'agit de "objet", C ++ n'a pas d'objet de base intégré, mais toute bibliothèque de collecte que vous utilisez aura une telle chose que vous pouvez sousclure.


6 commentaires

Compte tenu de ce que vous avez montré, comment au monde êtes-vous de savoir quels types ces indicateurs indiquent-ils?


Tout d'abord, ce n'était pas la question, mais de répondre, il y a toutes sortes de façons. 1) Vous pouvez avoir un tableau parallèle avec le type codé dedans. 2) Vous pouvez faire les structures d'éléments de tableau d'une variable de type et une union avec tous les types de choses que vous voudrez peut-être y mettre. Il y a 2 juste sur le dessus de ma tête. Je suis sûr que quelqu'un d'autre peut venir avec des alternatives slicker.


@SBI: Et vous pouvez également utiliser RTTI.


@kriss: Non, vous ne pouvez pas. RTTI fonctionne uniquement dans les hiérarchies de la classe polymorphe. Compte tenu d'un Void * , le système d'exécution ne vous donne rien pour savoir ce qu'il pointe.


@SBI: Vous avez raison. S'il veut utiliser RTTI, l'OP devrait mettre toutes ses structures dans une hiérarchie de classe commune, mais la classe de base peut toujours être assez vide. Eh bien, ce n'est pas beaucoup mieux que d'utiliser un syndicat plus un type d'énumération discriminant.


En fait, c'est fondamentalement la même chose. :-) sauf qu'il y a plus de surcharge c ++ gunky. :-))



3
votes

oui. Deux manières:

• Les pointeurs sur un type de classe de base, qui pointent vers des objets de types dérivés de ce type de base.
• Indescriptions VOID * Les pointeurs, qui doivent être couplés manuellement sur les types d'objets réels qu'ils indiquent.

La première approche est la programmation standard orientée objet.

La deuxième approche est utile pour la programmation de bas niveau (par exemple, pilotes de périphériques, bibliothèques de gestion de la mémoire, etc.), et est considérée comme dangereuse et appropriée uniquement pour les programmeurs qui savent exactement ce qu'ils font. De toute évidence, cela nécessite des informations de comptabilité supplémentaires pour vous dire quel est le type réel de chaque pointeur.


0 commentaires

0
votes
#include <stdio.h>

int main(void)
{
  void * ptr[2];
  int *a;
  int b;

  ptr[0] = "[0] = \"This is a string & c does it better\", [1] = ";
  *a = 2;
  ptr[1] = a;
  b = *((int *) ptr[1]);
  printf("%s",  (char *) ptr[0] );
  printf("%i\n", b );

  return 0;
}

0 commentaires