94 votes

L'expression doit avoir le type de classe

Je n'ai pas codé en c++ depuis un certain temps et je suis resté bloqué lorsque j'ai essayé de compiler ce simple extrait :

class A
{
  public:
    void f() {}
};

int main()
{
  {
    A a;
    a.f(); // works fine
  }

  {
    A *a = new A();
    a.f(); // this doesn't
  }
}

2 votes

La ligne qui dit "ceci n'est pas" est en fait OK, ce qui rend votre question confuse.

182voto

Kos Points 29125

C'est un pointeur, alors essayez plutôt :

a->f();

En gros, l'opérateur . (utilisé pour accéder aux champs et aux méthodes d'un objet) est utilisé sur les objets et les références, donc :

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

Si vous avez un type de pointeur, vous devez d'abord le déréférencer pour obtenir une référence :

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

El a->b n'est généralement qu'un raccourci pour (*a).b .

Une note sur les pointeurs intelligents

El operator-> peut être surchargé, ce qui est notamment utilisé par les pointeurs intelligents. Lorsque vous utilisez des pointeurs intelligents alors vous utilisez aussi -> pour faire référence à l'objet pointé :

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

0 votes

Je débute en C++, je dois encore faire en sorte que ce soit un automatisme de déterminer s'il faut utiliser un pointeur ou une référence. Dans mon cas particulier, tout ce dont j'avais besoin était une référence, mais pour une raison quelconque, j'ai passé un pointeur à la place. Quoi qu'il en soit, merci pour cette explication claire !

16voto

phresnel Points 20082

Permettre une analyse.

#include <iostream>   // 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.
}

Un conseil général :

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

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

  void foo (std::vector<int> const &input) {...}
  void bar () { 
       std::vector<int> 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.

En règle générale, si vous devez gérer la mémoire par vous-même, il existe déjà un gestionnaire supérieur ou une alternative, qui suit le principe RAII.

10voto

Ozair Kafray Points 7445

Résumé : Au lieu de a.f(); il devrait l'être a->f();

Dans la partie principale, vous avez défini a comme un pointeur vers objet de A afin de pouvoir accéder aux fonctions en utilisant l'option -> opérateur.

Un site alternativement mais la manière la moins lisible est (*a).f()

a.f() aurait pu être utilisé pour accéder à f(), si a a été déclaré comme : A a;

7voto

Dark Falcon Points 15609

a est un pointeur. Vous devez utiliser -> pas .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X