如何在函数参数中使用类

how to use a class in a function parameter

本文关键字:参数 函数      更新时间:2023-10-16

请帮助,我正在设计一个联系人本作为一个项目,我正在正确编译代码,我得到错误。关于地址类的问题…请随意复制并运行代码,看看我在说什么。提前感谢

 #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& addressconst 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