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> entre autres choses, testclass a cette fonction: p> 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 à Solutions possibles: p> copier la mémoire: p>
renvoie un pointeur B de la fonction et faites quelque chose comme ça p>
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>
Temp = A;
A=A->Foo();
freeMemory(Temp);
memcpy(this, B, sizeof(TestClass));
7 Réponses :
Comment je peux faire cela = b p> blockQuote>
vous ne pouvez pas. p>
L'une des solutions de travail: memcpy (ceci, b, taille de la taille de (testclass)); Cette méthode fonctionne correctement. P> blockQuote>
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. P>
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).
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. P>
Je suis sûr que vous devriez regarder les pointeurs intelligents em> 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. P>
Vous ne pouvez pas. Pour réaliser pourquoi, réfléchissez à ce code: P> Ce code> est défini par la norme sous forme de
testclass * const code>.
int main() {
TestClass A;
A.Foo();
return 0;
}
Utilisez un niveau supplémentaire d'indirection. Votre testClass peut avoir un pointeur qui pointe vers une classe qui contient toutes ses données. Assurez-vous simplement que votre Opérateur == code> renvoie true si le contenu de m_data sont égaux. p> p>
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.
Ce que vous faites n'est pas bon.
Tout d'abord, vous avez la fonction Alors, pourquoi ne pas simplement changer la classe existante dans la classe que vous souhaitez? p> qui dit, vous pouvez faire mais c'est aussi méchant que vos autres solutions. Nous avons probablement besoin de plus de contexte pour vous donner la meilleure solution. P> P> foo code> qui: p>
foo code> statique et prenez " > Ce code> manuellement ": p>
à l'intérieur de votre fonction, vous pouvez faire
Foo(TestClass &X);
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 ++