如何在函数参数中使用类
how to use a class in a function parameter
请帮助,我正在设计一个联系人本作为一个项目,我正在正确编译代码,我得到错误。关于地址类的问题…请随意复制并运行代码,看看我在说什么。提前感谢
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
class Address
{
private:
string home;
string street;
string apt;
string city;
string state;
string zip;
public:
Address();
string getHome() const;
string getStreet() const;
string getApt() const;
string getCity() const;
string getState() const;
string getZip() const;
void output() const;
void input();
};
class contact{
private:
string fn;
string ln;
Address address;
string email;
string number;
public:
void input();
void output();
void setname(string f_n, string l_n);
void setaddress(Address home);
void setemail(string emaila);
void setnumber(string num);
string getname();
string getAddress();
string getemail();
string getnumber();
contact();
contact(string f_n, string l_n, Address home,string emaila,string num);
};
void menu(string opt);
int main(){
string opt="";
contact c;
c.input();
menu(opt);
c.output();
cout<<"input up to 10 contacts, type quit to stop if less than 10: "<<endl;
return 0;
}
void menu(string opt){
cout<<"Choose(type) a Menu: search | display all(show) | exit'"<<endl;
cin>>opt;
if(opt=="search")cout<<"write a function that index"<<endl;
else if(opt=="show")cout<<"write a function that display all: "<<endl;
else if(opt=="exit")exit(0);
}
contact::contact(){
fn=""; ln=""; Address address; email=""; number="";
}
contact::contact(string f_n, string l_n, Address address,string emaila,string num){
fn= f_n; ln= l_n; address ="" ;email= emaila;number= num;
}
void contact::input(){
for (int i=1; i<=10;i++){//allow 10 contacts
cout<<"fn and ln separate by a space: ";
cin>>fn>>ln;
cout<<"address: ";
Address.input();
cout<<"email: ";
cin>>email;
cout<<"phone number: ";
cin>>number;
}
}
void contact::output(){
cout<<"name: "<<fn<<" "<<ln<<" address "<<Address.output();<<" email: "<<email<<" digits "<<number<<endl;
}
void contact::setname(string f_n, string l_n){
fn= f_n; ln= l_n;
}
void contact::setemail(string emaila){
email= emaila;
}
void contact::setnumber(string num){
number= num;
}
string contact::getAddress(){
return Address address;
}
string contact::getname(){
return fn, ln;
}
string contact::getemail(){
return email;
}
string contact::getnumber(){
return number;
}
下面是运行clang时的代码输出(因为它的消息要好得多)。
λ > clang++ blah.cxx
blah.cxx:81:27: error: no viable overloaded '='
fn= f_n; ln= l_n; address ="" ;email= emaila;number= num;
~~~~~~~ ^~~
blah.cxx:5:11: note: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'const char [1]' to 'const Address' for 1st argument
上面的意思是你不能这样做:address = ""
,因为你没有任何从const char*
到Address
对象的隐式转换。
您可能指的是this->address = address
,因为似乎您想要分配您在构造函数中收到的address
?
作为旁注,根据您使用的编译器,您可能希望通过引用传递Address address
,如Address& address
或const Address& address
(表明您不会修改被引用的对象)在函数参数列表中。尽管一些编译器(如果不是最广泛使用的编译器)会实现复制省略优化。
例如,你的构造函数参数看起来像这样:
contact(string f_n, string l_n, const Address& home,string emaila, string num);
class Address
^
blah.cxx:89:8: error: expected unqualified-id
Address.input();
^
blah.cxx:97:43: error: 'Address' does not refer to a value
cout<<"name: "<<fn<<" "<<ln<<" address "<<Address.output();<<" email: "<<email<<" digits "<<number<<endl;
^
成员对象名为address
,而不是Address
。您想要调用address.output()
,否则Address.output()
实际上试图从Address
类中调用static
函数output
。
blah.cxx:97:60: error: expected expression
cout<<"name: "<<fn<<" "<<ln<<" address "<<Address.output();<<" email: "<<email<<" digits "<<number<<endl;
和上面一样的问题,使用address.output()
,因为你在address
上调用函数output()
。
blah.cxx:110:8: error: 'Address' does not refer to a value
return Address address;
^
return address;
是返回address
对象的正确方法。return Address address;
是胡说八道。
blah.cxx:113:8: warning: expression result unused [-Wunused-value]
return fn, ln;
^~
1 warning and 5 errors generated.
fn
在这里没有使用。只是一个警告,但它表明您要么忘记使用它,要么可以将其从代码中删除而不会造成损害。
通过查看您的代码,错误似乎在以下地方(我没有编译您的代码)
contact::contact(string f_n, string l_n, Address address,string emaila,string num){
fn= f_n; ln= l_n; address ="" ;email= emaila;number= num;
}
当你这样做
address ="";
没有重载=操作符将address设置为空字符串。
必须重载"="操作符,将Address类的每个成员都设置为空字符串。
试试这样写:
Address operator=(string str)
{
this.home = str;
this.street = str;
this.apt = str;
this.city = str;
this.state = str;
this.zip = str;
}
在input()函数中:
Address.input ();不能使用类直接调用函数,除非将函数设置为静态。你应该使用:
address.input ();
相似。而不是
Address.output();
使用address.output();
这里一定有另一个错误:
return Address address;
不能返回这样的指针。想象一下如何返回一个char指针。例如,如果你有:
char *a;
则假设在函数中:
(char*) test()
{
return a; //notice not "return char a"
}
同样,在代码中应该返回对象而不是类类型。例如
return address; //not return Address address
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类