Boriska
Помогающий
Offline
|
|
« : 24-09-2021 10:49 » |
|
Либерти С за 21 день. стр 164 https://ibb.co/K5sNsvmОни - объекты, они же изолированы, каждый имеет свое и только функции общие...
|
|
« Последнее редактирование: 24-09-2021 11:45 от Boriska »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 24-09-2021 12:52 » |
|
Не понятно, какая связь между цитатой из книги и Си.
По цитате: вообще написано нечто недостаточно ясное. Я так понял: Cat::some_method(Cat &other) { ... other.itsAge ... }. Да, так можно. Код не различает "свой" объект и "чужой".
|
|
« Последнее редактирование: 24-09-2021 12:57 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #2 : 24-09-2021 13:37 » |
|
А как же пресловутая фраза, что методы объекта предназначены для работы с членами-полями объекта. А они значит могут вывести нутро другого, такого же ? А где про это можно глянуть, чтоб понять, почему так.
|
|
« Последнее редактирование: 24-09-2021 13:59 от Boriska »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #3 : 24-09-2021 15:29 » |
|
Я так понял, что тут говорится примерно про такой случай #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
|
|
« Ответ #4 : 24-09-2021 22:42 » |
|
Код для класса один. Объектов может быть сколько угодно. Скрывать поля объекта своего класса только потому что он не this? А смысл? Дело не только в копировании. Любой метод, например сравнение, может иметь доступ к приватным членам другого объекта своего класса. Если, конечно, у него есть указать или ссылка на него. Ну или копия. 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
Помогающий
Offline
|
|
« Ответ #5 : 30-09-2021 04:34 » |
|
А почитать например про конструктор копирования. Или почитать на переопределение различных операторов. Ну если это оставлено специально для целей копирования или перегрузки операторов, почему оставлено и для всех остальных случаев. Это же можно было бы как-то урезать ? И потом оговорить это в литературе. А так как-то в период изучения конструкторов как-то не обращаешь на эту особенность внимания, а потом возникают вопросы. Да как по мне, страдает концепция защиты полей или стройность. Это создание бэк доров void steal_secret(const Cat& otherCat) { secret = otherCat.secret; }
|
|
« Последнее редактирование: 30-09-2021 04:41 от Boriska »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #6 : 30-09-2021 20:01 » |
|
"В литературе" все оговорено. Скока там? 1857 страниц?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 01-10-2021 03:29 » |
|
Boriska, выдача копий или ссылок на константы наружу из класса не нарушают целостность класса, поэтому это можно свободно делать (с многопоточностью, правда, немного сложнее)
а чтобы случайно не "портить" поля класса в тех методах, где это не должно произойти, сам метод можно пометить как const
|
|
|
Записан
|
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #8 : 01-10-2021 09:14 » |
|
"В литературе" все оговорено. Скока там? 1857 страниц? "Литературу" скачал. Как в ней ориентироваться, ну к примеру с нашим случаем ? Литература гласит http://ibb.co/q0nC365 только друзья и мемберы. Нет я понимаю, что доступ есть, как это найти ?
|
|
« Последнее редактирование: 01-10-2021 10:25 от Boriska »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #9 : 01-10-2021 12:53 » |
|
Код класса имеет доступ к мемберам и методам согласно простым правилам, описанным во всех самоучителях и справочниках. Для кода класса нет своих и чужих объектов. Если имеется от "чужого" объекта своего класса значение, ссылка или указатель, имеет те же права доступа к его мемберам и методам, как и с this.
|
|
« Последнее редактирование: 01-10-2021 13:10 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #10 : 01-10-2021 20:35 » |
|
Почитать внимательно про private, protected и public области более внимательно. В чем у них принципиальная разница. Также понять в чем разница между понятиями "класс" и "экземпляр класса". То, что ты пишеш в реализации методов класса, ты сам себе злобный буратино. Компилятор не должен и не может отлавливать твои логические ошибки. А начальство и коллеги просто будут очень сильно стучать по рукам, выпремляя их. А если не будет помогать, то скорее всего отправят в свободное плавание.
|
|
« Последнее редактирование: 01-10-2021 20:37 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #11 : 02-10-2021 05:00 » |
|
Кстати, когдв решишся изучать python. То после С++ будут последние волосы на затылке вставать дыбом. В python вполне возможна такое использование переменных class a: def __init__(self): pass b = a() b.a = 6 print(b.a) Т.е. завести переменную вне класса в экземпляре класса и использовать ее извне. При этом никак не влияя на работу класса.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #12 : 26-01-2022 07:40 » |
|
Привет. Коллеги разъясните пожалуйста. char* p_string = new char[5]; delete p_string;
char* p_string = new char[5]; delete []p_string; Студия говорит - правильный второй вариант. Во втором случае подчеркивает зеленым и пишет "память была выделена при помощи оператора new [] для массивов, а удалятеся при помощи скалярного оператора delete " Прошу разъяснить, мы когда получаем char* p_string = new char[5]; мы получаем указатель на символ, про массив указатель не знает. Почему же Липман удалят чрезе delete []p_string; и почему студия видит что это какой то не совсем указатель на char
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 26-01-2022 08:36 » |
|
Boriska, второй вариант правильный. Как выделялось, так и должно удаляться: char* p_item = new char; delete p_item;
char* p_array = new char[5]; delete [] p_array; при других сочетания будет неопределённое поведение программы А подчёркивает статический анализатор - он может такие ошибки выявлять иногда
|
|
|
Записан
|
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #14 : 26-01-2022 12:43 » |
|
Погоди Алексей. В С++ указатель на char, он же ничего не может знать кроме как про char. Я понимаю, что в доке написано надо delete [] pointer; Тогда поясни. Мы когда записываем char* p_item = new char; мы же делаем два действия 1.Запрашиваем чтобы ОС выделила нам память. 2.Запоминаем адрес начала куска этой памяти и ОС уже знает что это наша память.
теперь я рассуждаю как в С#, если я удаляю ссылку и ссылок больше нет, ею может воспользоваться кто угодно и мусорщик ее помечает что она ничья. в С++ же по идее если мы делаем delete pointer, мы как я понимаю помечаем что этот кусок уже ни чей - пользуйтесь, а что там лежит уже никого не интересует.
В нашем случае что несет информацию сколько памяти освободить ? скобки-бред Я так понимаю ОС выделила память и отдала дескриптор, и она знает сколько памяти выделено на данный дескриптор, поступил запрос отдать память по этому дескриптору, она разберется сколько. Нифига не пойму зачем скобки, а главное как "[]pointer" превращается в pointer, ведь для delete нужен pointer(адрес).
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 27-01-2022 03:30 » |
|
Boriska, нужно исходить из того, что это требуется стандарт C++: для аллокации/освобождения на куче одного элемента используется new/delete для аллокации/освобождения на куче массива элементов используется new[]/delete[] если не соблюдать, будет UB про ОС - нет ни слова. Это стандарт языка А тонкости реализации могут быть свои у разных компиляторов - для одного элемента размер выделенного блока известен (sizeof(type)) , а для массива, я полагаю, количество элементов где-то сохраняется дополнительно. со скобками и без - это разные операторы https://en.cppreference.com/w/cpp/memory/new/operator_newhttps://en.cppreference.com/w/cpp/memory/new/operator_deleteа ещё а ещё есть placement вариант вызова new, когда можно конструировать объект в заранее выделенной памяти. И это единственный случай, когда нужно вручную вызывать деструктор
|
|
« Последнее редактирование: 27-01-2022 03:32 от Алексей++ »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #16 : 27-01-2022 21:23 » |
|
С точки зрения управления памятью, со скобками или без — пофиг. Не пофиг деструкторам объектов. Одно дело массив символов, другое дело — массив объектов. Без скобок будет вызван деструктор только для первого объекта в массиве, на который и указывает указатель. Со скобками он вызовет деструктор на каждом объекте в массиве (размер он знает). В любом случае лучше писать корректно. Положены скобки — пиши со скобками. Заведи себе правило компилироваться с максимумом предупреждений. Доводи программу до их полного отсутствия.
Массив символов в современном C++ — это архаично. Попробуй std::string. Не забивай себе мозги ерундой, пока не знаешь достаточно.
|
|
« Последнее редактирование: 27-01-2022 21:25 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #17 : 04-02-2022 14:33 » |
|
Привет. static_cast<>, dinamic_cast<>, reinterprit_cast<>.... Липман пишет, что более читаемо, но также опасно как и раньше (int)m1 (double)m2..., надо чтобы программист по прежнему держал под контролем. Подскажите что же нового, прогрессивного оно нам принесло, мне так старый синтаксис получше будет. Или они генерируют исключения ? И если исключения генерит, нельзя ли было сделать чтобы скобки их генерировали ?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #18 : 04-02-2022 17:11 » |
|
|
|
« Последнее редактирование: 04-02-2022 17:13 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #19 : 04-02-2022 17:55 » |
|
Липман. Стенли Липман автор некоротого числа книг по С++. В спецификации языка ничего на мой вопрос нет, там только какие типы и чем могут быть преобразованы. А как он поведет себя при не совпадении, зачем выдуман более сложный синтаксис - там такого не пишут, ну или я не умею читать спецификацию.
|
|
|
Записан
|
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #20 : 15-12-2023 10:19 » |
|
Это как С++ такое может быть. char code_page_ru[256] = { [' '] = ' ', ['/'] = '/', ['.'] = '.', };
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #21 : 15-12-2023 10:31 » |
|
Boriska, это в Си так можно, а в C++ неможно )
|
|
|
Записан
|
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #22 : 15-12-2023 10:33 » |
|
а какова идея, как оно фунциклит ? Этж против всех законов физики. И по идее все законное в С - должно работать С++
|
|
« Последнее редактирование: 15-12-2023 10:35 от Boriska »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #23 : 15-12-2023 10:39 » |
|
Boriska, инициализация только элементов с индексами (size_t)' ' (size_t)'/' (size_t)'.' остальные элементы - обнуляются
Добавлено через 25 секунд: >>И по идее все законное в С - должно работать С++ нет, это разные языки
|
|
« Последнее редактирование: 15-12-2023 10:40 от Алексей1153 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 15-12-2023 10:43 » |
|
ещё в Си вот так можно struct A { int i1; int i2; int i3; int i4; };
struct A a={.i2=7, .i4=42};
|
|
|
Записан
|
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #25 : 15-12-2023 11:23 » |
|
вообще это какая то недокументированная фича или ...?
|
|
|
Записан
|
|
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #27 : 15-12-2023 12:33 » |
|
спсб
|
|
|
Записан
|
|
|
|
Boriska
Помогающий
Offline
|
|
« Ответ #28 : 02-02-2024 16:30 » |
|
Привет. Писал под контроллер и вдруг обнаружил, что char это не 8 а 16. В студии кодировка двухбайтовая вот и пожалуйста. В связи с этим вопрос о типах. Как нынче определять размер типа без sizeof. Вот допустим char будет зависеть не от контроллера или ПК, а от студии. А допустим int. По идее от платформы ?
|
|
|
Записан
|
|
|
|
|
|