如何在函数参数中使用类

时间:2011-10-26 03:45:44

标签: c++ visual-c++ g++

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

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

2 个答案:

答案 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& addressconst 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