6
votes

Comment réaffecter `this` le pointeur à l'intérieur de la fonction membre de l'objet?

J'ai une question intéressante sur les pointeurs C ++.

Vous penserez probablement que je dois changer de conception et éviter faire ce que je fais et que vous avez probablement raison. Mais supposons que j'ai une bonne raison de le faire mon chemin. P>

C'est donc la situation. J'ai une classe de test de classe C ++, et j'ai un pointeur A de ce type: p> xxx pré>

entre autres choses, testclass a cette fonction: p> xxx Pré>

Cette fonction crée un objet B du même type et la remplit de données avec certaines données. P>

à la fin de cette fonction, je veux un pointeur A pour pointer sur l'objet B. N'importe où à l'extérieur de cette fonction, il ressemblerait à a = b code> fort>; à l'intérieur de cette fonction Cela pourrait ressembler à ceci = b code> strong>

Mais comme vous savez que vous ne pouvez pas réaffecter "ce" pointeur " p>

Solutions possibles: p>

  1. copier la mémoire: p>

    Temp = A;
    A=A->Foo();
    freeMemory(Temp);
    
  2. renvoie un pointeur B de la fonction et faites quelque chose comme ça p>

    memcpy(this, B, sizeof(TestClass));
    


5 commentaires

Je ne pense pas qu'il y ait une bonne raison de faire cela.


Toute cette chose sent ça mal. Est-ce que foo () est vraiment une méthode de clone? Pourquoi FOO () nommé clone () et renvoyer un pointeur à l'objet nouvellement créé?


Pourquoi avez-vous besoin d'allouer un nouvel objet? Pourquoi ne pouvez-vous pas simplement écraser / réinitialiser tous les membres de A de A?


Si vous voulez avoir ceci == B à l'intérieur de FOO Fabrication d'une méthode privée appelée BFOO (FOO * A) et appelez-la de FOO (avec ceci sous forme de param). Maintenant, vous avez inversé les rôles). Bien sûr ... vous devez faire un = a-> foo () quand même !!


duplicailler possible de Comment attribuer un Valeur au pointeur 'Ceci' en C ++


7 Réponses :


8
votes

Comment je peux faire cela = b

vous ne pouvez pas.

L'une des solutions de travail: memcpy (ceci, b, taille de la taille de (testclass)); Cette méthode fonctionne correctement.

Si TestClass n'est pas une pod, cette fonction ne fonctionne pas. Vous ne pouvez pas les objets MEMCY avec des fonctions virtuelles, par exemple. Vous allez éloigner la tablette.


1 commentaires

Le pointeur de la fourgonnette n'est pas une grande problématique (puisqu'il est immuable pour un type de béton), mais toute autre référence qui nécessite une manipulation spéciale est - plus généralement, tout ce qui nécessite une copie CTOR (considérant le «si vous en avez besoin. toutes les trois "règles).



2
votes

Le problème est que de nombreux pointeurs, pas seulement a, peuvent pointer sur l'ancien objet. Le ce pointeur n'est pas un, bien que A contienne une copie de celui-ci. La seule façon de le faire est 1. Réaffecter A, ou 2. Fabriquez un nouveau type de pointeur qui ajoute un niveau d'indirection à votre objet afin que vous puissiez le remplacer sans personne sache.


0 commentaires

0
votes

Je suis sûr que vous devriez regarder les pointeurs intelligents comme moyen de résoudre ce problème. Celles-ci ajoutent essentiellement un niveau d'indirection supplémentaire (sans changer les clients de la syntaxe) et vous permettraient de modifier ainsi l'objet réel indiqué sans informer le client.


0 commentaires

4
votes

Vous ne pouvez pas. Ce code> est défini par la norme sous forme de testclass * const code>.

Pour réaliser pourquoi, réfléchissez à ce code: P>

int main() {
   TestClass A;
   A.Foo();
   return 0;
}


0 commentaires

13
votes

Utilisez un niveau supplémentaire d'indirection. Votre testClass peut avoir un pointeur qui pointe vers une classe qui contient toutes ses données. XXX

Assurez-vous simplement que votre Opérateur == renvoie true si le contenu de m_data sont égaux.


4 commentaires

Je pense que c'est le moyen le plus élégant de le faire si votre objectif est de minimiser la copie de données.


"Tout problème en informatique peut être résolu en ajoutant une autre couche d'abstraction" - (souhaite que je me souvienne d'où j'avais vu cela)


@FrustratedwithFormsDesigner: << a href = "http://www2.research.att.com/~bs/bs_faq.html#really-say-that" rel = "Nofollow Noreferrer"> www2.research.att.com/~ BS / BS_FAQ.HTML # Vraiment-dis-qui >. STROSTRUP est largement considéré comme le dit, mais il a cité David J. Wheeler.


Nice ... comme une mise en oeuvre de la chaîne d'objet avec un tampon de char [] interne. Je l'aime bien.



1
votes

Ce que vous faites n'est pas bon.

Tout d'abord, vous avez la fonction foo qui:

  • créer et générer une nouvelle classe
  • Réaffecte une classe existante à la nouvelle classe

    Alors, pourquoi ne pas simplement changer la classe existante dans la classe que vous souhaitez?

    qui dit, vous pouvez faire foo statique et prenez " > Ce manuellement ": xxx

    mais c'est aussi méchant que vos autres solutions. Nous avons probablement besoin de plus de contexte pour vous donner la meilleure solution.


0 commentaires

6
votes

à l'intérieur de votre fonction, vous pouvez faire

Foo(TestClass &X);


0 commentaires