#c #visual-c #g
#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;
}
Комментарии:
1. «не стесняйтесь копировать и запускать код, чтобы увидеть, о чем я говорю» — вы действительно позволите мне это сделать? Ну и дела, спасибо, мистер!!
2. Пожалуйста, опубликуйте свои ошибки — это намного проще для большинства людей.
3. какую точную ошибку вы получаете?
4. Сокращение вашего кода до минимального примера, который выдает ту же ошибку, является ключевым. Нам будет проще взглянуть на ваш код и понять, что в нем не так, а также поможет вам убрать все лишнее, на что вы обращали внимание, чтобы сосредоточиться на проблеме, которая может помочь вам исправить ее самостоятельно. И даже если вы не можете, это, безусловно, показывает нам, что вы пытались. Никто не хочет копаться в большом количестве постороннего кода, чтобы найти ошибки.
Ответ №1:
Вот результат вашего кода при запуске через 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 = ""
, потому что у вас нет никаких неявных преобразований из a const char*
в Address
объект.
Вы, вероятно, имели в виду this->address = address
, поскольку кажется, что вы хотели бы назначить address
полученный вами в конструкторе?
В качестве дополнительного примечания, в зависимости от используемого вами компилятора, вы можете захотеть передать Address address
по ссылке, например Addressamp; address
, или const Addressamp; address
(что указывает на то, что вы не будете изменять объект, на который ссылаются) в списке аргументов вашей функции. Хотя некоторые компиляторы (если не наиболее широко используемые) будут реализовывать оптимизацию копирования.
Например, аргументы вашего конструктора будут выглядеть следующим образом:
contact(string f_n, string l_n, const Addressamp; 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()
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. Хороший ответ. Также я бы упомянул передачу объектов в качестве параметров по ссылке, а не по значению
2. @Andrey — ввернул описание в верхней ошибке вместе со ссылкой на возможную оптимизацию компилятора с помощью copy ellision.
Ответ №2:
При просмотре вашего кода ошибка, похоже, находится в следующих местах (я не компилировал ваш код)
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 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 *a;
тогда предположим, что в функции:
(char*) test()
{
return a; //notice not "return char a"
}
аналогично в вашем коде вы должны возвращать объект, а не тип класса.
т.е.
return address; //not return Address address