【问题标题】:C++ Visual Studio "Non-standard syntax; use '&' to create a pointer to member" [closed]C ++ Visual Studio“非标准语法;使用'&'创建指向成员的指针”[关闭]
【发布时间】:2017-10-20 08:52:56
【问题描述】:

我多次遇到此错误(错误 C3867:非标准语法;使用“&”创建指向成员的指针)。我知道这个问题已经被问过很多次了,但我不明白为什么会出现这个问题以及我能做些什么来解决它。我已经阅读了很多关于指针如何工作的指南,并且我尝试过学习新知识,但我不知道如何正确地做到这一点。

对于这个问题,我做了一个简单的代码。谁能帮我理解为什么会出现这个错误以及如何修复这个代码?

错误: 错误 C3867:'BankAccount::amountOfMoney':非标准语法;使用 '&' 创建指向成员的指针

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;
}

【问题讨论】:

  • 你需要回顾一下如何调用一个方法
  • amountOfMoney是一个函数,所以你必须使用()来调用它。否则编译器认为你想要函数的 addresscout &lt;&lt; bankAccount1.amountOfMoney() &lt;&lt; endl;

标签: c++ visual-studio


【解决方案1】:

您忘记了函数调用运算符()。将您的 main 代码更改为:

int main(){

    BankAccount bankAccount1("testName", 200.0);

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

}

如果没有括号,它会尝试打印成员函数的地址,除非该函数不是类的成员,否则它无法做到这一点。

【讨论】:

  • 这是我尝试执行“-9.25596e+61”时的输出。它不应该返回双“钱”的价值吗?
  • @Kasper - 那么money 的值是多少?你没有在构造函数中设置一个值...... (顺便说一句,从一个真正为银行工作的人那里,当你开一个新账户时,它永远不会有任何钱。你必须做一个存款。:-)
  • @Kasper 它完全按照您的描述进行:返回 money 的值。您从未初始化双精度,因此它将获得一个“未初始化”值,(至少在 Windows 上)通常看起来像 0xCCCC CCCC CCCC CCCD(64 位)。因此-9.25596e+61.
  • 啊,当然!我完全忘了从构造函数中设置值。感谢你们所有人解释它是如何工作的:)
【解决方案2】:

如果你想调用你的成员函数,请使用括号。:

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

【讨论】:

  • 第二个选项错误。您无法获得指向amountOfMoney 的简单指针。它是一个成员函数,不能生成指向成员函数的简单指针。你可以生成一个“指向成员函数的指针”但这不是一个指针(语法是&amp;BankAccount::amountOfMoney)。
  • 我会在它被否决之前删除这个答案。
  • 第二个选项只会打印'1',因为语法将更改为&amp;BankAccount::amountOfMoney
  • 奇怪 - 我的本地编译器 (CYGWIN 6.4.0) 允许,但 Godbolt 不允许。好的,我将删除第二个选项并重新输入。编辑:这是允许它的 -fpermissive 选项。
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 2015-11-10
  • 2017-03-02
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
相关资源
最近更新 更多