2017-10-20 6 views
0

J'ai créé un erreur (erreur C3867: syntaxe non standard, utilisez '&' pour créer un pointeur vers le membre) deux-trois fois. Je sais que cette question a été posée à plusieurs reprises, mais je ne comprends pas pourquoi le problème se produit et ce que je peux faire pour y remédier. J'ai lu beaucoup de guides comment les pointeurs fonctionnent et j'ai essayé de jouer avec les nouvelles connaissances, mais je ne sais pas comment le faire correctement.C++ Visual Studio "Syntaxe non standard; utilisez '&' pour créer un pointeur sur le membre"

Pour cette question, j'ai fait un code simple. Quelqu'un peut-il m'aider à comprendre pourquoi cette erreur se produit et comment réparer ce code?

Erreur: erreur C3867: 'BankAccount :: amountOfMoney': syntaxe non standard; utiliser '&' pour créer un pointeur vers un membre

Source.cpp

#include <iostream> 
#include <string> 

#include "BankAccount.h" 

using namespace std; 

int main(){ 

    BankAccount bankAccount1("testName", 200.0); 

    cout << bankAccount1.amountOfMoney << endl; 

} 

BankAccount.h

#pragma once 
#include <string> 

using namespace std; 

class BankAccount 
{ 
public: 
    BankAccount(); 
    BankAccount(string name, double money); 
    ~BankAccount(); 
    double amountOfMoney(); 

private: 
    string name; 
    double money; 
}; 

BankAccount.cpp

#include "BankAccount.h" 


BankAccount::BankAccount() 
{ 
} 

BankAccount::BankAccount(string n, double m) { 
    name = n; 
} 

BankAccount::~BankAccount() 
{ 
} 

double BankAccount::amountOfMoney() { 
    return money; 
} 
+0

vous devez revoir comment appeler une méthode – user463035818

+3

'amountOfMoney' est une fonction, vous devez donc utiliser'() 'pour l'appeler. Sinon, le compilateur pense que vous voulez l'adresse * de la fonction. 'cout << bankAccount1.amountOfMoney() << endl;' –

Répondre

3

Vous avez oublié l'opérateur d'appel de fonction (). Changer votre code main à:

int main(){ 

    BankAccount bankAccount1("testName", 200.0); 

    cout << bankAccount1.amountOfMoney() << endl; 

} 

Sans les parenthèses, il tente d'imprimer l'adresse d'une fonction de membre, qu'il ne peut pas faire à moins que la fonction n'est pas un membre d'une classe.

+0

Ceci est la sortie lorsque j'essaye de faire cela "-9.25596e + 61". Ne devrait-il pas renvoyer la valeur du double "argent" à la place? –

+2

@Kasper - Alors quelle est la valeur de 'money'? Vous ne définissez pas de valeur dans le constructeur ... * (Et BTW, d'un gars qui travaille pour une banque, quand vous ouvrez un nouveau compte, il n'y a jamais, jamais d'argent sur elle, vous devez faire un dépôt. : -) * –

+0

@Kasper Il a fait exactement ce que vous décrivez: retourner la valeur de 'money'. Vous n'avez jamais initialisé le double afin qu'il reçoive une valeur "non initialisée", qui (sur Windows au moins) ressemble généralement à '0xCCCC CCCC CCCC CCCD' (64 bits). D'où le '-9.25596e + 61'. – Arrrow

0

Si vous voulez appeler votre fonction membre, utilisez les supports .:

cout << bankAccount1.amountOfMoney() << endl; 
+1

La deuxième option est ** incorrecte **. Vous ne pouvez pas obtenir un simple pointeur sur 'amountOfMoney'. C'est une fonction membre, et vous ne pouvez pas générer un pointeur simple vers une fonction membre. Vous pouvez générer un "pointer-to-member-function" * mais ce n'est pas un pointeur * (et la syntaxe est '& BankAccount :: amountOfMoney'). –

+0

Je supprimerais cette réponse avant qu'elle ne soit abaissée. –

+0

La deuxième option afficherait simplement '1', étant donné que la syntaxe serait changée en '& BankAccount :: amountOfMoney' – Arrrow