问题描述
我必须制作一个像这样的方法:
我必须制作这样的方法:
我必须制作这样的方法:
我必须制作这样的方法:
我必须制作这样的方法:
我必须制作这样的方法:
我必须制作这样的方法:
我必须制作这样的方法:
我必须制作这样的方法:
我必须制作这样的方法:
我必须制作这样的方法:
v
我必须制作这样的方法:
//os1.miasto()="Zmieniono miasto osoby 1.";
#ifdef _WIN32
#include <windows.h>
#endif // _WIN32 and _WIN64 too
#include <string>
using namespace std;
class adres{
string mia,ul;
int nr;
public:
adres(): mia(""),ul(""),nr(0){}
adres(const string& a1,const string& a2,int a3): mia(a1),ul(a2),nr(a3){}
ostream& view(ostream& out) const{
return out << mia << "," << ul << "," << nr << '\n';
}
friend
ostream& operator<< (ostream& out,const adres& r);
};
ostream& operator<< (ostream& out,const adres& r){
return r.view(out);
}
class osoba{
string im;
int wi;
adres* adr;
public:
osoba():im(""),wi(0),adr(0){}
osoba(const string& a1,int a2,const adres& a3):im(a1),wi(a2),adr(new adres(a3)){}
osoba(const osoba& a1): im(a1.im),wi(a1.wi),// konstruktor kopiujacy
adr(new adres(*a1.adr)) {}
osoba& operator=(const osoba& a1){ // operator przypisania kopiujacego
if(this != &a1){ // jeżeli adresy obiektów są różne
delete adr;
im = a1.im;
wi = a1.wi;
adr = new adres(*a1.adr);
}
return *this; // Porównywane obiekty są takie same,zwraca referencje do samego siebie
}
~osoba(){ delete adr; }
// resztę dopisz sam - potrzebne są metody miasto() w tej klasie
friend ostream& operator<< (ostream& out,const osoba& r);
};
ostream& operator<< (ostream& out,const osoba& r){
return out << r.im << "," << r.wi << "," << *r.adr ;
}
int main(){
#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
#endif
adres* wsk = new adres("Częstochowa","Dąbrowskiego",73);
cout << wsk << '\n';
cout << *wsk << '\n';
adres a1(*wsk);
delete wsk;
wsk=nullptr; // Należy uruchomić jako g++ -std=c++0x -Wall -pedantic Zadanie2.cpp -o Zadanie2.exe
const adres* wsk1 = new adres("Łódź","Piotrkowska",33);
cout << a1 << '\n';
cout << *wsk1 << '\n';
adres a2;
cout << a2 << '\n';
a2 = a1;
cout << a2 << '\n';
osoba os1("Ala",25,*wsk1);
delete wsk1;
cout << os1 << '\n';
osoba os2(os1);
//os1.miasto()="Zmieniono miasto osoby 1.";
cout << os2 << '\n';
//osoba os3;
//cout << os3 << '\n';
//os3 = os2;
//os1.miasto()="Drugi raz zmieniono miasto osoby 1.";
//cout << os3 << '\n';
} ```
解决方法
city()
成员函数只需要返回非const
引用的任何带有operator=(const char*)
或可以从其构造的其他类型的对象。例如...
struct Person {
std::string city_;
std::string& city() { return city_; }
...whatever else...
};
通常不认为这是好的界面设计!
,如果city()
是返回对实例person1
的类的成员函数的 reference 的函数,则
person1.city() = "City of person 1 changed";
是一种通过返回的引用修改该成员的方法。
除非小心使用,否则可能会避开封装。但这有时是有用的:(i)C ++标准库在函数名称标准化但成员变量未标准化的情况下采用此方法(除了几个例外-例如std::cout
-C ++标准库成员变量都隐藏为实现使用保留标识符的详细信息),(ii)city()
可能是多态的。