Saltar al contenido

La expresión debe tener un tipo de clase

Es importante interpretar el código bien antes de utilizarlo a tu trabajo si ttienes algo que aportar puedes dejarlo en la sección de comentarios.

Solución:

Es un puntero, así que en su lugar intente:

a->f();

Básicamente el operador . (usado para acceder a los campos y métodos de un objeto) se usa en objetos y referencias, por lo que:

A a;
a.f();
A& ref = a;
ref.f();

Si tiene un tipo de puntero, primero debe desreferenciarlo para obtener una referencia:

A* ptr = new A();
(*ptr).f();
ptr->f();

El a->b notación suele ser sólo una abreviatura de (*a).b.

Una nota sobre los punteros inteligentes

El operator-> se puede sobrecargar, lo que es especialmente utilizado por los punteros inteligentes. Cuando usa punteros inteligentes, también usa -> para referirse al objeto señalado:

auto ptr = make_unique();
ptr->f();

Permitir un análisis.

#include    // not #include "iostream"
using namespace std;  // in this case okay, but never do that in header files

class A

 public:
  void f()  cout<<"f()n"; 
;

int main()

 /*
 // A a; //this works
 A *a = new A(); //this doesn't
 a.f(); // "f has not been declared"
 */ // below


 // system("pause");  <-- Don't do this. It is non-portable code. I guess your 
 //                       teacher told you this?
 //                       Better: In your IDE there is prolly an option somewhere
 //                               to not close the terminal/console-window.
 //                       If you compile on a CLI, it is not needed at all.

Como consejo general:

0) Prefer automatic variables
  int a;
  MyClass myInstance;
  std::vector myIntVector;

1) If you need data sharing on big objects down 
   the call hierarchy, prefer references:

  void foo (std::vector const &input) ...
  void bar ()  
       std::vector something;
       ...
       foo (something);
  


2) If you need data sharing up the call hierarchy, prefer smart-pointers
   that automatically manage deletion and reference counting.

3) If you need an array, use std::vector<> instead in most cases.
   std::vector<> is ought to be the one default container.

4) I've yet to find a good reason for blank pointers.

   -> Hard to get right exception safe

       class Foo 
           Foo () : a(new int[512]), b(new int[512]) 
           ~Foo() 
               delete [] b;
               delete [] a;
           
       ;

       -> if the second new[] fails, Foo leaks memory, because the
          destructor is never called. Avoid this easily by using 
          one of the standard containers, like std::vector, or
          smart-pointers.

Como regla general: si necesita administrar la memoria por su cuenta, generalmente ya hay un administrador superior o una alternativa disponible, una que sigue el principio RAII.

Resumen: En vez de a.f(); debería ser a->f();

En main has definido a como un puntero a objeto deA, para que pueda acceder a las funciones usando el -> operador.

Un alterno, pero la forma menos legible es (*a).f()

a.f() se podría haber usado para acceder a f(), si a fue declarado como:
A a;

Finalizando este artículo puedes encontrar las explicaciones de otros usuarios, tú además puedes dejar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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