我正在尝试调用一个函数。这些愚蠢的编译错误的原因是啥?
Posted
技术标签:
【中文标题】我正在尝试调用一个函数。这些愚蠢的编译错误的原因是啥?【英文标题】:I'm trying to call a function. What is the cause of these silly compilation errors?我正在尝试调用一个函数。这些愚蠢的编译错误的原因是什么? 【发布时间】:2012-01-13 21:56:53 【问题描述】:我正在尝试运行我编写的这个 c++ 程序。我在 Visual C++ 中遇到以下错误:
1>c:\users\server\desktop\problem7\problem7\main.cpp(26) : 错误 C3867: 'Payment::getamount': 函数调用缺少参数列表;使用 '&Payment::getamount' 创建指向成员的指针
1>c:\users\server\desktop\problem7\problem7\main.cpp(74) : 错误 C3867: 'cashPayment::paymentDetails': 函数调用缺少参数列表;使用 '&cashPayment::paymentDetails' 创建指向成员的指针
1>c:\users\server\desktop\problem7\problem7\main.cpp(75) : 错误 C3867: 'CreditCardPayment::paymentDetails': 函数调用缺少参数列表;使用 '&CreditCardPayment::paymentDetails' 创建指向成员的指针
代码是:
#include <iostream>
#include <cstring>
using namespace std;
class Payment
private: float amount;
public: Payment(float=0.0);
void paymentDetails();
float getamount();
void setamount(float);
;
Payment::Payment(float a)
setamount(a);
void Payment::setamount(float a)amount=a;
float Payment::getamount()return amount;
void Payment::paymentDetails()
cout<<"The amount of payment is : "<<getamount<<"$"<<endl;
class cashPayment: public Payment
public: cashPayment(float=0.0);
void paymentDetails();
;
cashPayment::cashPayment(float a):Payment(a);
void cashPayment::paymentDetails()
cout<<"The payment in cash is : "<<getamount()<<"$"<<endl;
class CreditCardPayment: public Payment
private: char* name;
int creditnumber;
int day,month,year;
public: CreditCardPayment(char[]=" ",int=0, int=0, int=0, int=0 ,float=0.0);
void paymentDetails();
;
CreditCardPayment::CreditCardPayment(char* n, int cn, int d, int m, int y, float a):Payment(a)
int l=strlen(n);
name = new char[l+1];
strncpy(name,n,l);
name[l]='\0';
creditnumber=cn;
day=d;
month=m;
year=y;
void CreditCardPayment::paymentDetails()
cout<<"Credit Card Holder Information & Payment: "<<endl;
cout<<"Name is "<<name<<endl;
cout<<"Credit Number is "<<creditnumber<<endl;
cout<<"Expiration Date (Day / Month / Year) is "<<day<<"/"<<month<<"/"<<year<<endl;
//cout<<"Payment is "<<Payment::getamount()<<"$"<<endl;
int main()
CreditCardPayment cc1("Mohammad",936623,21,9,2011,3000);
cashPayment cp1(4500);
cp1.paymentDetails;
cc1.paymentDetails;
system("pause");
return 0;
【问题讨论】:
你想买一些括号吗?cp1.paymentDetails
=> cp1.paymentDetails()
.
首先,您应该指出代码中的哪些行(带有 cmets)是产生错误的行,以便人们可以轻松找到它们。
@KenWhite:公平地说,编译错误有行号,只有几行错误有意义。
@CharlesBailey,真的。但是海报具有编译器正在标记的确切行位置(并且可以在此处发布之前在代码编辑器中找到并标记它们),并且标记它们使需要扫描的内容更清楚以找到原因。您必须阅读的代码越少,您就能越快发现问题并提供答案,提问者就越快恢复工作。 :) 而且我没有否决这个问题 - 我向提出问题的人提出了一个建议,以帮助那些试图帮助他/她的人。
【参考方案1】:
在这里:
void Payment::paymentDetails()
cout<<"The amount of payment is : "<<getamount<<"$"<<endl;
编译器告诉您,您的意思可能是 getamount()
而不是 getamount
。
这里也一样:
cp1.paymentDetails;
cc1.paymentDetails;
你的意思可能是:
cp1.paymentDetails();
cc1.paymentDetails();
与其他一些语言不同,在 C++ 中,当您调用不带参数的函数时,您仍然必须在括号中提供一个空参数列表。
【讨论】:
【参考方案2】:cp1.paymentDetails;
cc1.paymentDetails;
错误状态为“函数调用缺少参数列表”。您的函数调用确实缺少参数列表。你需要使用()
来调用函数:
cp1.paymentDetails();
cc1.paymentDetails();
错误的后半部分,读作“'&Payment::getamount' to create a pointer to member”是一个“有用的”提示,如果您打算获取函数的地址,则需要使用一元&
(地址)运算符。
有这个提示是因为在计算非成员函数的地址时不需要运算符(为了与 C 和遗留代码兼容),但在计算一个非静态成员函数。
【讨论】:
以上是关于我正在尝试调用一个函数。这些愚蠢的编译错误的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章