¿Asignación dentro de la función que se pasa como puntero?
-
03-07-2019 - |
Pregunta
ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(ClassA* pa,ClassB* pb)
{
pa = new ClassA;
pb = new ClassB;
}
cuál será el valor de pa, pb después de ejecutar la función
EDITAR cómo pasar como puntero es el retorno si pa, pb es NULL
Solución
Como se señaló en otras respuestas, ambas seguirán siendo NULL después de la llamada. Sin embargo, hay dos posibles soluciones a este problema:
1) referencias
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) puntos
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 mayoría de los programadores probablemente elegirían referencias porque no necesitan afirmar nada (las referencias nunca pueden ser NULL).
Otros consejos
Serán NULL, ya que los pasa por valor. Si desea pasarlo por referencia, debe hacer esto:
ClassA* pa = NULL;
ClassA* pb = NULL;
assignObject(ClassA*& pa, ClassB*& pb)
{
pa = new ClassA;
pb = new ClassB;
}
Tenga en cuenta que no estoy seguro de lo que está intentando lograr con las variables globales. Nunca se utilizan en este ejemplo, ya que las variables locales (parámetros de función) las ocultan.
Creo que también necesita declarar un tipo de valor de retorno para su función para que sea válida C ++.
ClassA* pa = NULL;
ClassA* pb = NULL;
void assignObject(ClassA* &pa,ClassB* &pb)
{
pa = new ClassA;
pb = new ClassB;
}
Alternativamente:
ClassA* pa = NULL;
ClassA* pb = NULL;
void assignObject(ClassA** pa,ClassB** pb)
{
*pa = new ClassA;
*pb = new ClassB;
}
NULL, porque estás pasando los punteros por valor.