C ++ Object.method=“字符串”

问题描述

我必须制作一个像这样的方法: 我必须制作这样的方法: 我必须制作这样的方法: 我必须制作这样的方法: 我必须制作这样的方法: 我必须制作这样的方法: 我必须制作这样的方法: 我必须制作这样的方法: 我必须制作这样的方法: 我必须制作这样的方法: 我必须制作这样的方法: 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()可能是多态的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...