请帮助,我设计一个联系簿作为一个项目,我正在正确编译代码,我得到错误。关于地址类的问题..随意复制和运行代码,看看我在说什么。提前谢谢
#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;
}
答案 0 :(得分:2)
这是通过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
(表示您不会修改被引用的对象) )在你的函数参数列表中。虽然一些编译器(如果不是最广泛使用的编译器)将实现copy ellision optimization。
例如,您的构造函数参数将如下所示:
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()
正在尝试从output
班级拨打Address
blah.cxx:97:60: error: expected expression
cout<<"name: "<<fn<<" "<<ln<<" address "<<Address.output();<<" email: "<<email<<" digits "<<number<<endl;
。{/ p>
address.output()
与上述问题相同,使用output()
,因为您在address
上调用了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
此处未使用{{1}}。只是一个警告,但它表示您忘记使用它,或者它可以从您的代码中删除而不会造成伤害。
答案 1 :(得分:0)
通过查看您的代码,错误似乎在以下位置(我还没有编译您的代码)
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 operator=(string str)
{
this.home = str;
this.street = str;
this.apt = str;
this.city = str;
this.state = str;
this.zip = str;
}
输入()函数中的: 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