Russian Qt Forum
Май 21, 2024, 02:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Изменить ссылку (?)  (Прочитано 20872 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Февраль 09, 2013, 19:04 »

я не понял: при создании CTest, ref - ещё не готова.. Чего вы туда (в конструктор) передавать будете?
Ну чего же "не готова"? Я создал переменную int и подаю ссылку в конструктор. Вообще забить ссылку какой-то заглушкой - вполне норм, в том же Qt неоднократно наблюдал типа if (brush == noBrush) и.т.п

Какой смысл в этом извращении?
Это уже хорошо объяснил Old

Конечно, всякие shared_ptr и reference_wrapper там излишни (это я в надежде получить Шнобелевскую премию) прикрутил..
Я почти уверен что с таким владением std - точно получите (не от меня так от другого), но сильно сомневаюсь что будете рады  Улыбающийся

И вместо того, чтобы в Вашем классе A использовать голый указатель, используете rew
Зачем столько усилий чтобы "одеть указатель"? Чем Вас так ужасно пугает его нагота? Чем "одетый" стал лучше если он также доступен как по записи, так и по чтению?

А вообще, это попытка обойти то, ради чего ссылки были задуманы (по крайней мере, одной из целей).
Ну вот я задумываю класс A и четко вижу что mData должен всегда существовать, иначе смысла нет. Следуя рекомендациям лучших собаководов я объявляю mData ссылкой. Потом... оба-на! оказывается A нужно читать/писать!, а mData-то еще нет. Так что, я должен "поступиться принципами" и бежать менять ссылки на указатели? Или как?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #31 : Февраль 09, 2013, 19:09 »

Перечитайте еще раз это:
Ну вот я задумываю класс A и четко вижу что mData должен всегда существовать, иначе смысла нет.

Это ответ на все ваши вопросы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Февраль 09, 2013, 19:27 »

Это ответ на все ваши вопросы.
Не вижу ответа на главный
Так что, я должен "поступиться принципами" и бежать менять ссылки на указатели? Или как?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #33 : Февраль 09, 2013, 19:32 »

Так что, я должен "поступиться принципами" и бежать менять ссылки на указатели? Или как?
Нет. Нужно вначале получать mData, ссылку на который и передавать при конструировании объекта.
В связи с:
четко вижу что mData должен всегда существовать, иначе смысла нет.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #34 : Февраль 09, 2013, 21:30 »

Я могу создать A пока с каким-то фуфлом а потом (когда образовался data) присвоить, но это коряво.
Что бы вы ни делали, после создания объекта A ваша ссылка mData всегда будет эквивалентом этого "фуфла". Можно, конечно, этому "фуфлу" присвоить полученное значение data, но вы ведь не этого добиваетесь?
Если цитировать Страуструпа, ссылка является альтернативным именем объекта, ее всегда надо инициализировать, значение ссылки никогда не меняется после инициализации. Т.е. ссылка появляется либо одновременно с объектом, на который она ссылается, либо позже.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Февраль 09, 2013, 22:18 »

Я могу создать A пока с каким-то фуфлом а потом (когда образовался data) присвоить, но это коряво.
Что бы вы ни делали, после создания объекта A ваша ссылка mData всегда будет эквивалентом этого "фуфла".
Верно, проcто так не присвоить
Код
C++ (Qt)
int i1 = 1, i2 = 2;
CTest test1(i1);
CTest test2(i2);
test2 = test1;   // так нельзя из-за ссылки в CTest
 
Придется городить что-то типа
Код
C++ (Qt)
CTest::CTest( int & ref, const CTest & other );
 
Что выглядит совсем уныло  Плачущий

Нет. Нужно вначале получать mData, ссылку на который и передавать при конструировании объекта.
Не думаю что есть хоть один читатель этой темы который не видел бы такой простой и 100% корректной возможности. Однако я так не сделал, более того, полагаю что и многие другие не делали бы так. Если неясно почему - можно просто спросить (а не писать жирным, а потом еще и красным Улыбающийся)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #36 : Февраль 09, 2013, 22:30 »

Не думаю что есть хоть один читатель этой темы который не видел бы такой простой и 100% корректной возможности. Однако я так не сделал, более того, полагаю что и многие другие не делали бы так. Если неясно почему - можно просто спросить (а не писать жирным, а потом еще и красным Улыбающийся)
Смеющийся
Спросить о чем? Что мне должно быть не ясно?
Вы четко написали утверждение:
четко вижу что mData должен всегда существовать, иначе смысла нет.
Это означает, что "mData должно всегда существовать". И вот ссылку, на вот это существующее mData, нужно передавать в конструктор.
Или это не вы писали? Или это не так?

Однако я так не сделал, более того, полагаю что и многие другие не делали бы так.
Первая часть предложения меня уже не удивляет, а вторая вызывает большие сомнения. Подмигивающий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #37 : Февраль 09, 2013, 23:19 »

Верно, проcто так не присвоить
Код
C++ (Qt)
test2 = test1;   // так нельзя из-за ссылки в CTest
 
Почему? Или вы имеете ввиду дефолтный оператор присваивания?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Февраль 10, 2013, 12:10 »

Почему? Или вы имеете ввиду дефолтный оператор присваивания?
Да, компилятор не пропустит дефолтный, перекрыть можно, но это не поможет со ссылкой

Это означает, что "mData должно всегда существовать". И вот ссылку, на вот это существующее mData, нужно передавать в конструктор.
Или это не вы писали? Или это не так?
Да, было так (когда я задумывал класс). А потом, когда мне понадобилось читать/писать в поток - вроде стало уже и не так Плачущий  Дело в том что с I/O нет реальной возможности сначала прочитать то на что ссылаются, а потом тех кто ссылается (вызвав для них цивильный конструктор). Как правило файл данных организован примерно так: сначала контейнер объектов класса A, потом класса B и.т.д. Контейнеры могут следовать в любом порядке. Не могу я подгонять файл данных под конструкторы ссылок, глупо это Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Февраль 10, 2013, 12:20 »

Проще выражаясь, Igors создаёт проблему, просит решение.
Не припоминаю когда я у Вас хоть что-то "просил" Улыбающийся Я "предлагаю обсудить" (вот правильное выражение) проблему которая у меня возникла, и которая, может быть, будет интересна другим. Да, я имею право критиковать решения предложенные другими - также как и они мои, это нормально. А если Вам так неймется, то переходите в "ответы на вопросы новичков" - это самый важный раздел форума, недаром он поставлен первым  Улыбающийся
Записан
Bepec
Гость
« Ответ #40 : Февраль 10, 2013, 12:26 »

Жесткая критика и указание недостатков - разные вещи Улыбающийся

Именно на это я и указываю. Кому - то нравится, наверно, такое отношение. Мне нет.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #41 : Февраль 10, 2013, 12:33 »

Да, было так (когда я задумывал класс). А потом, когда мне понадобилось читать/писать в поток - вроде стало уже и не так Плачущий
Вот это меня удивляет. Проектирования не было никакого? Что вижу, то пою. Улыбающийся

Не могу я подгонять файл данных под конструкторы ссылок, глупо это Улыбающийся
Конечно. Но для чего менять конструктор? Уже если начали приделывать костыли, то проще менять реализацию (внутри класса хранить не ссылку, а указатель), а конструкторы оставить с ссылками.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #42 : Февраль 10, 2013, 12:36 »

Да, было так (когда я задумывал класс). А потом, когда мне понадобилось читать/писать в поток - вроде стало уже и не так Плачущий
Вот это меня удивляет. Проектирования не было никакого? Что вижу, то пою. Улыбающийся

Не могу я подгонять файл данных под конструкторы ссылок, глупо это Улыбающийся
Конечно. Но для чего менять конструктор? Уже если начали приделывать костыли, то проще менять реализацию (внутри класса хранить не ссылку, а указатель), а конструкторы оставить с ссылками.


Аха.. Только если не менять конструктор, то и указатель уже не поможет)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #43 : Февраль 10, 2013, 12:44 »

Аха.. Только если не менять конструктор, то и указатель уже не поможет)
Почему? При конструировании передавать "фуфло", а дальше править.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #44 : Февраль 10, 2013, 12:49 »

Аха.. Только если не менять конструктор, то и указатель уже не поможет)
Почему? При конструировании передавать "фуфло", а дальше править.


А, вон оно что..  В замешательстве
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 23.