как использовать класс в параметре функции - PullRequest
0 голосов
/ 26 октября 2011

, пожалуйста, помогите, я проектирую книгу контактов как проект, и у меня правильно компилируется код, и я получаю ошибки.проблема в отношении класса Address .. не стесняйтесь копировать и запускать код, чтобы увидеть, о чем я говорю.заранее спасибо

 #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 ]

2 голосов
/ 26 октября 2011

Вот вывод вашего кода при запуске через 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 (что означает, что вы не будете изменять объект, на который ссылаетесь) в списке аргументов вашей функции.Хотя некоторые компиляторы (если не наиболее широко используемые) будут реализовывать оптимизацию ellision копирования .

Например, ваши аргументы конструктора будут выглядеть так:

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() действительно пытается вызвать static функцию с именем output из класса Address.


blah.cxx:97:60: error: expected expression
cout<<"name: "<<fn<<" "<<ln<<" address "<<Address.output();<<" email: "<<email<<"         digits "<<number<<endl;

Та же проблема, что и выше, используйте address.output(), так как вы вызываете функцию output() on 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 здесь не используется.Просто предупреждение, но оно указывает на то, что вы либо забыли его использовать, либо он может быть без вреда удален из вашего кода.

0 голосов
/ 26 октября 2011

Видя ваш код, ошибка, кажется, в следующих местах (я не скомпилировал ваш код)

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

в вашей функции input (): Address.input (); * +1014 *

вы не можете использовать класс для непосредственного вызова функции, если не сделаете функцию статической. Вы должны использовать:

address.input ();

аналогично. вместо

Address.output();

использование

address.output();

Другая ошибка должна быть здесь:

return Address address;

Вы не возвращаете указатели, подобные этому. Просто представьте, как бы вы вернули указатель на символ. Например, если у вас есть:

char *a;

затем предположим, что в функции:

(char*) test()
{
  return a; //notice not "return char a"
}

аналогично в вашем коде вы должны возвращать объект, а не тип класса. т.е.

return address; //not return Address address
...