Assegnazione all'interno della funzione che viene passata come puntatore?
-
03-07-2019 - |
Domanda
ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(ClassA* pa,ClassB* pb)
{
pa = new ClassA;
pb = new ClassB;
}
quale sarà il valore di pa, pb dopo aver eseguito la funzione
EDIT come passare come puntatore è il ritorno se pa, pb è NULL
Soluzione
Come indicato in altre risposte, entrambi saranno comunque NULL dopo la chiamata. Tuttavia, esistono due possibili soluzioni a questo problema:
1) referenze
void assignObject(ClassA*& pa, ClassB*& pb)
{
pa = new ClassA;
pb = new ClassB;
}
ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(pa, pb); // both will be assigned as expected.
2) puntatori
void assignObject(ClassA** pa, ClassB** pb)
{
assert(pa != NULL); assert(pb != NULL);
*pa = new ClassA;
*pb = new ClassB;
}
ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(&pa, &pb); // both will be assigned as expected.
La maggior parte dei programmatori probabilmente sceglierebbe riferimenti perché in tal caso non devono far valere nulla (i riferimenti non possono mai essere NULL).
Altri suggerimenti
Saranno NULL, poiché li stai passando per valore. Se vuoi passarlo per riferimento, dovresti farlo:
ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(ClassA*& pa, ClassB*& pb)
{
pa = new ClassA;
pb = new ClassB;
}
Nota, non sono sicuro di ciò che stai cercando di ottenere con le variabili globali. Non vengono mai utilizzati in questo esempio, poiché le variabili locali (parametri di funzione) le nascondono.
Penso che sia necessario dichiarare anche un tipo di valore restituito per la propria funzione affinché sia ??C ++ valido.
ClassA* pa = NULL;
ClassA* pb = NULL;
void assignObject(ClassA* &pa,ClassB* &pb)
{
pa = new ClassA;
pb = new ClassB;
}
In alternativa:
ClassA* pa = NULL;
ClassA* pb = NULL;
void assignObject(ClassA** pa,ClassB** pb)
{
*pa = new ClassA;
*pb = new ClassB;
}
NULL, perché stai passando i puntatori in base al valore.