Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- int ComputeDistance(const string& source, const string& destination)
- {
- return source.length() - destination.length();
- }
- class Route
- {
- public:
- **********************************************************************************************************
- C одной стороны в методе GetSource() нигде не написано, что он не имеет права изменять текущий объект.
- В этом методе можем, например, поменять поле source и ничто этому не помешает.
- С другой стороны функция PrintRoute() принимает константную ссылку на маршрут.
- Эта функция не имеет права поменять переданный ей маршрут.
- А метод GetSource(), который вызывается от константной ссылки может поменять этот объект.
- Поэтому нужно указать в методе GetSource(), что он не имеет права изменять переданный объект.
- **********************************************************************************************************
- string GetSource() const
- {
- return source;
- }
- string GetDestination() const
- {
- return destination;
- }
- int GetLength() const
- {
- return length;
- }
- // Попробуем объявить константным метод SetSource
- error: passing 'const Route' as 'this' argument discards qualifiers
- // Попытка вызвать из якобы константного метода SetSource неконстантый метод UpdateLength
- void SetSource(const string& new_source) /*const */
- {
- source = new_source;
- UpdateLength();
- }
- void SetDestination(const string& new_destination)
- {
- destination = new_destination;
- UpdateLength();
- }
- private:
- void UpdateLength()
- {
- length = ComputeDistance(source, destination);
- }
- string source;
- string destination;
- int length;
- };
- void PrintRoute(const Route& route)
- {
- cout << route.GetSource() << " - " <<
- route.GetDestination() << "\n";
- // Не нужно по константной ссылке вызывать метод SetSource(), так как он может изменить текущий объект.
- /*route.SetSource("Moscow");*/
- }
- void ReverseRoute(Route& route)
- {
- // По неконстантной ссылке на маршрут можем вызвать как
- //константные методы (GetSource, GetDestination),
- //так и неконстантые методы (SetSource, SetDestination)
- string old_source = route.GetSource();
- string old_destination = route.GetDestination();
- route.SetSource(old_destination);
- route.SetDestination(old_source);
- }
- int main()
- {
- Route route;
- route.SetSource("Moscow");
- route.SetDestination("Vologda");
- PrintRoute(route);
- ReverseRoute(route);
- PrintRoute(route);
- return 0;
- }
- **************************************************************************************************
- Методы могут быть:
- константными - не имеют права менять текущий объект
- неконстантными
- Если пишем метод, который текущий объект не меняет, то метод нужно объявить константным
- По константной ссылке на объект можно вызвать только константый метод
- По НЕконстантной ссылке на можно вызвать ЛЮБОЙ метод текущего объекта
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement