Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Это как С++ такое может быть.  (Прочитано 959 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Boriska
Помогающий

ua
Offline Offline

« : 24-09-2021 10:49 » 

Либерти С за 21 день. стр 164 https://ibb.co/K5sNsvm
Они - объекты, они же изолированы, каждый имеет свое и только функции общие...
« Последнее редактирование: 24-09-2021 11:45 от Boriska » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 24-09-2021 12:52 » 

Не понятно, какая связь между цитатой из книги и Си.

По цитате: вообще написано нечто недостаточно ясное. Я так понял: Cat::some_method(Cat &other) { ... other.itsAge ... }. Да, так можно. Код не различает "свой" объект и "чужой".
« Последнее редактирование: 24-09-2021 12:57 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Boriska
Помогающий

ua
Offline Offline

« Ответ #2 : 24-09-2021 13:37 » 

А как же пресловутая фраза, что методы объекта предназначены для работы с членами-полями объекта. А они значит могут вывести нутро другого, такого же ? А где про это можно глянуть, чтоб понять, почему так.
« Последнее редактирование: 24-09-2021 13:59 от Boriska » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 24-09-2021 15:29 » 

Я так понял, что тут говорится примерно про такой случай
Код: (C++)
#include <iostream>
#include <string>

class Cat {
public:
    Cat(const std::string& Name, int Age) {
        name = Name;
        itsAge = Age;
    }
   
    Cat(const Cat& obj) {
        name = obj.name;
        itsAge = obj.itsAge;
    }
   
    void print() {
        std::cout << "Cat name is " << name << " and  " << itsAge
                  << " years old" << std::endl;
    }
private:
    std::string name;
    int itsAge;

};


int main() {
    Cat Fresske("Freeske", 5);
    Cat Boots(Fresske);
    Boots.print();
    return 0;
}
А почитать например про конструктор копирования. Или почитать на переопределение различных операторов. В принципе для этого это нужно.
« Последнее редактирование: 24-09-2021 15:37 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 24-09-2021 22:42 » 

Код для класса один. Объектов может быть сколько угодно. Скрывать поля объекта своего класса только потому что он не this? А смысл?
Дело не только в копировании. Любой метод, например сравнение, может иметь доступ к приватным членам другого объекта своего класса. Если, конечно, у него есть указать или ссылка на него. Ну или копия.
Код: (C++)
class X {
        int v;
    public:
        X(int v) : v(v) {}
        bool operator< (const X& other) { return v < other.v; }
};
« Последнее редактирование: 24-09-2021 22:44 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Boriska
Помогающий

ua
Offline Offline

« Ответ #5 : 30-09-2021 04:34 » 

Цитата
А почитать например про конструктор копирования. Или почитать на переопределение различных операторов.
Ну если это оставлено специально для целей копирования или перегрузки операторов, почему оставлено и для всех остальных случаев. Это же можно было бы как-то урезать ? И потом оговорить это в литературе. А так как-то в период изучения конструкторов как-то не обращаешь на эту особенность внимания, а потом возникают вопросы.
Да как по мне, страдает концепция защиты полей или стройность. Это создание бэк доров Улыбаюсь
Код:
void steal_secret(const Cat& otherCat) { secret = otherCat.secret; }
« Последнее редактирование: 30-09-2021 04:41 от Boriska » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 30-09-2021 20:01 » 

"В литературе" все оговорено. Скока там? 1857 страниц?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #7 : 01-10-2021 03:29 » 

Boriska, выдача копий или ссылок на константы наружу из класса не нарушают целостность класса, поэтому это можно свободно делать (с многопоточностью, правда, немного сложнее)

а чтобы случайно не "портить" поля класса в тех методах, где это не должно произойти, сам метод можно пометить как const
Записан

Boriska
Помогающий

ua
Offline Offline

« Ответ #8 : 01-10-2021 09:14 » 

Цитата
"В литературе" все оговорено. Скока там? 1857 страниц?
"Литературу" скачал.  Как в ней ориентироваться, ну к примеру с нашим случаем ?
Литература гласит http://ibb.co/q0nC365 только друзья и мемберы.
Нет я понимаю, что доступ есть, как это найти ?
« Последнее редактирование: 01-10-2021 10:25 от Boriska » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 01-10-2021 12:53 » 

Код класса имеет доступ к мемберам и методам согласно простым правилам, описанным во всех самоучителях и справочниках.
Для кода класса нет своих и чужих объектов. Если имеется от "чужого" объекта своего класса значение, ссылка или указатель, имеет те же права доступа к его мемберам и методам, как и с this.
« Последнее редактирование: 01-10-2021 13:10 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 01-10-2021 20:35 » 

Почитать внимательно про private, protected и public области более внимательно. В чем у них принципиальная разница. Также понять в чем разница между понятиями "класс" и "экземпляр класса". То, что ты пишеш в реализации методов класса, ты сам себе злобный буратино. Компилятор не должен и не может отлавливать твои логические ошибки. А начальство и коллеги просто будут очень сильно стучать по рукам, выпремляя их. А если не будет  помогать, то скорее всего отправят в свободное плавание.
« Последнее редактирование: 01-10-2021 20:37 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 02-10-2021 05:00 » new

Кстати, когдв решишся изучать python. То после С++ будут последние волосы на затылке вставать дыбом. В python вполне возможна такое использование переменных
Код: (Python)
class a:
    def __init__(self):
        pass
   
   
b = a()
b.a = 6
print(b.a)
Т.е. завести переменную вне класса в экземпляре класса и использовать ее извне. При этом никак не влияя на работу класса.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines