Resuelto: la expresión debe tener un error de tipo de clase en C++

Shikha Chaudhary 12 octubre 2023
  1. Resuelto: la expresión debe tener un error de tipo de clase en C++
  2. La causa de la expresión debe tener un error de tipo de clase en C++
  3. Solución para la expresión debe tener un error de tipo de clase en C++
  4. Conclusión
Resuelto: la expresión debe tener un error de tipo de clase en C++

En C++, el operador de punto (.) se usa para la selección directa de miembros, mientras que el operador de flecha (->), por otro lado, se usa para la selección indirecta de miembros. Ambos operadores tienen importancia, pero debe tener cuidado dónde y cómo los usa.

Esto generalmente depende de si el objeto se instancia utilizando el operador nuevo o no. Discutiremos todo esto, pero por ahora, sepa que el error la expresión debe tener un tipo de clase es uno de esos errores de C++ que se produce por el uso incorrecto del operador punto (.).

Veamos por qué sucede esto y cómo solucionarlo.

Resuelto: la expresión debe tener un error de tipo de clase en C++

Para comprender mejor la declaración del problema, mire el código a continuación. Aquí tenemos una clase llamada Desiertos con la función desierto() dentro de ella.

En el bloque principal, definimos un puntero d a la clase Desiertos y luego usamos el operador punto (.) con el puntero d para acceder al método de clase desierto(). Pero cuando ejecutamos este código, obtenemos un error.

#include <iostream>
using namespace std;

class Deserts {
 public:
  void desert() { cout << "Have a cake!" << endl; }
};

int main() {
  Deserts *d = new Deserts();
  d.desert();
}

Producción :

In function 'int main()':
error: request for member 'desert' in 'd', which is of pointer type 'Deserts*' (maybe you meant to use '->' ?)
   15 |     d.desert();
      |       ^~~~~~

Esto sucede por el uso incorrecto del operador punto (.). Repasemos rápidamente los conceptos básicos del operador de punto (.) para obtener más claridad.

el operador punto (.) en C++

El operador de punto (.) en C++ se utiliza para acceder a los atributos y métodos de un objeto. En otras palabras, podemos decir que se utiliza para la selección directa de miembros a través del nombre del objeto.

Sintaxis:

object_name.member_name;

Aquí hay un ejemplo que muestra cómo funciona el operador de punto (.) en C++. Aquí tenemos una estructura llamada Desierto con dos miembros.

Dentro del bloque principal, creamos un objeto d y asignamos valores a los dos miembros de la estructura. Ahora, para imprimir los valores de los miembros del objeto d, usamos el operador punto (.), como puedes ver en las líneas 12 y 13.

Básicamente, así es como funciona el operador de punto (.) en C++.

Para obtener más información sobre el operador de punto (.) en C++, consulte este enlace.

#include <iostream>
using namespace std;

struct Desert {
  int cookie, cake;
};

int main() {
  struct Desert d = {10, 2};

  cout << "Cookies present:" << d.cookie << endl;  // use dot operator
  cout << "Cakes present  :" << d.cake << endl;    // use dot operator

  return 0;
}

Producción :

Cookies present:10
Cakes present  :2

Así que ahora piensa por un minuto, ¿puedes encontrar la causa del error en el código anterior? Si es así, entonces felicitaciones a usted.

Si no, entonces ¡sigue leyendo!

La causa de la expresión debe tener un error de tipo de clase en C++

El error la expresión debe tener un tipo de clase se produce cuando el operador de punto (.), normalmente utilizado para acceder a los miembros de un objeto, se utiliza en un puntero a un objeto. Piensa en esto, de esta manera.

Utiliza el operador de punto (.) en un puntero a un objeto. Ahora, trabajando como lo hace normalmente, el operador de punto (.) intentará encontrar los miembros del puntero (campos o métodos).

Es de sentido común que el objeto de una clase y el puntero de una clase son dos cosas diferentes. Cuando creamos un objeto para una clase, los miembros de la clase también se vuelven parte del objeto, pero esto no sucede cuando definimos un puntero a una clase.

Entonces, ¿podemos decir que el puntero está tratando de encontrar algo que ni siquiera existe?

Absolutamente sí, y es por eso que obtenemos el error.

Solución para la expresión debe tener un error de tipo de clase en C++

Podemos corregir la expresión debe tener un error de tipo de clase en C++ de dos maneras. Discutámoslos uno por uno.

Inicialice el objeto sin el uso del nuevo operador para resolver el error de tipo de clase en C++

Cuando usamos el operador nuevo para inicializar un objeto, usamos un puntero, como se muestra a continuación.

class *object = new class();

Entonces, la primera opción que tenemos es quitar el puntero inicializando el objeto sin usar el operador nuevo así:

class object;

Ahora, volvamos a ejecutar el código problemático con este cambio. Esta vez, instanciamos el objeto sin usar el operador nuevo, y el código funciona bien.

#include <iostream>
using namespace std;

class Deserts {
 public:
  void desert() { cout << "Have a cake!" << endl; }
};

int main() {
  Deserts d;  // Instantiate the object without using the new operator
  d.desert();
}

Producción :

Have a cake!

Pero ahora, puede preguntarse si instanciar un objeto sin usar el operador nuevo es lo correcto. Bueno, lo es.

Cuando usamos el operador nuevo para inicializar un objeto, permanece en la memoria hasta que lo borramos. Sin embargo, si no usamos el operador nuevo, el objeto se destruye cuando sale del alcance.

Por lo tanto, depende de usted elegir si desea utilizar el operador nuevo o no, según la necesidad. Pero recuerde que si usa el operador nuevo, entonces usar el operador de punto (.) para acceder a los miembros del objeto genera un error.

En ese caso, debe usar el operador de flecha (->) en lugar del operador de punto (.), como se explica en la siguiente sección.

Utilice el operador de flecha (->) para resolver el error de tipo de clase en C++

El operador de flecha (->) se utiliza para acceder a los miembros de un objeto mediante un puntero. En otras palabras, el operador de flecha (->) se utiliza para la selección indirecta de miembros a través de un puntero.

Por lo tanto, cuando usamos el operador nuevo para instanciar un objeto, no debemos usar el operador punto (.) de esta manera:

pointer_to_object.class_member;

Más bien, dado que se trata de un puntero, deberíamos usar el operador de flecha (->) de esta manera:

pointer_to_object->class_member;

Hagamos este cambio en el código problemático y volvamos a ejecutarlo. Puede ver que esta vez el código funciona bien.

#include <iostream>
using namespace std;

class Deserts {
 public:
  void desert() { cout << "Have a cake!" << endl; }
};

int main() {
  Deserts *d = new Deserts();
  d->desert();  // use arrow operator to access the object member via pointer
}

Producción :

Have a cake!

Tenga en cuenta que usar el operador de flecha (->) es solo una forma abreviada de la siguiente notación:

(*pointer_to_object).class_member

¿Puedes averiguar qué significa esto?

Bueno, dado que el operador de punto (.) se usa en objetos y referencias y no en punteros, el tipo de puntero debe ser desreferenciado primero para obtener la referencia del objeto. Luego, podemos usarlo junto con el operador de punto (.) para acceder a los miembros del objeto.

Pero la mejor manera de hacer esto es usar el operador de flecha (->), ya que es corto y ordenado.

Para saber más sobre el operador de flecha (->) en C++, consulte esta documentación.

Conclusión

Este artículo nos enseñó sobre el error la expresión debe tener un tipo de clase en C++. Discutimos por qué ocurre este error y las diversas soluciones para solucionarlo.

Artículo relacionado - C++ Error