¿Puede una clase de C++ tener un objeto de tipo propio?

Una declaración de clase puede contener un objeto estático de tipo propio, también puede tener un puntero a tipo propio, pero no puede tener un objeto no estático de tipo propio.

Por ejemplo, el siguiente programa funciona bien.

// A class can have a static member of self type
#include<iostream>
  
using namespace std;
  
class Test {
  static Test self;  // works fine
  
  /* other stuff in class*/ 
  
};
  
int main()
{
  Test t;
  getchar();
  return 0;
}

Y el siguiente programa también funciona bien.

// A class can have a pointer to self type
#include<iostream>
  
using namespace std;
  
class Test {
  Test * self; //works fine
  
  /* other stuff in class*/ 
  
};
  
int main()
{
  Test t;
  getchar();
  return 0;
}

Pero el siguiente programa genera un error de compilación » el campo ‘self’ tiene un tipo incompleto «

// A class cannot have non-static object(s) of self type.
#include<iostream>
  
using namespace std;
  
class Test {
  Test self; // Error
  
  /* other stuff in class*/ 
  
};
  
int main()
{
  Test t;
  getchar();
  return 0;
}

Si un objeto no estático es miembro, la declaración de clase está incompleta y el compilador no tiene forma de averiguar el tamaño de los objetos de la clase.
Las variables estáticas no contribuyen al tamaño de los objetos. Entonces, no hay problema para calcular el tamaño con variables estáticas de tipo propio.
Para un compilador, todos los punteros tienen un tamaño fijo independientemente del tipo de datos al que apuntan, por lo que tampoco hay problema con esto.

Gracias a Manish Jain y Venki por su contribución a esta publicación. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Categories C++

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *