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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Изменить ссылку (?)  (Прочитано 21819 раз)
Bepec
Гость
« Ответ #15 : Февраль 09, 2013, 15:47 »

Не "покажет", а скажет - смотрите в "ННН" и делайте сами Веселый

PS интересные провокации из "ничего".
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Это правильный костыль.. Очень правильный) С таким запросто можно и вторую ногу себе отстрелить  Улыбающийся
Прошу показать каким образом
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



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

Не "покажет", а скажет - смотрите в "ННН" и делайте сами Веселый
"ННН"... зачем Вы так буст зашифровали? Улыбающийся
Записан

Пока сам не сделаешь...
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Это правильный костыль.. Очень правильный) С таким запросто можно и вторую ногу себе отстрелить  Улыбающийся
Прошу показать каким образом

А это не очевидно?

Тогда приведите пример функции A::someMethod, по аналогии с моим вариантом..
Записан

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

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

Сообщений: 11445


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

А это не очевидно?
Мне лично нет  Улыбающийся

Тогда приведите пример функции A::someMethod, по аналогии с моим вариантом..
Код
C++ (Qt)
#include <stdio.h>
 
struct CTest {
CTest( int & ref ) : mRef(ref) {}
 
void SetRef( int & ref ) { (&mDummy)[1] = &ref; }
void Print( void ) const { printf("a = %d (%p)\n", mRef, &mRef); }
 
// data
void * mDummy;
int & mRef;
};
 
int main( void )
{
int i1 = 4;
CTest test(i1);
test.Print();
 
int i2 = 7;
test.SetRef(i2);
test.Print();
 
return 0;
}
 
В принципе меня это вполне устраивает. Но было бы здОрово как-то избавиться от mDummy
« Последнее редактирование: Февраль 09, 2013, 16:43 от Igors » Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

В принципе меня это вполне устраивает. Но бы здОрово как-то избавиться от mDummy
Не в коем случае! Не нужно портить этот шедевр.  Строит глазки
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Igors, Вы что, издеваетесь?)

Или я похоже уже совсем перестал понимать, что происходит)
« Последнее редактирование: Февраль 09, 2013, 16:46 от m_ax » Записан

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

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

Сообщений: 11445


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

Не в коем случае! Не нужно портить этот шедевр.  Строит глазки
Igors, Вы что, издеваетесь?..
Почему такая реакция? Улыбающийся Да, это грязный хак, понимаю что "идет вразрез" и все такое. Ну так показываем где/как это заклинит.
Записан
Bepec
Гость
« Ответ #23 : Февраль 09, 2013, 17:01 »

Проще выражаясь, Igors создаёт проблему, просит решение.

Получает решение, критикует его, тыкает автора носом в его произведение и довольный собой уходит Веселый

Примерно так это видится в моих глазах Веселый
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Не в коем случае! Не нужно портить этот шедевр.  Строит глазки
Igors, Вы что, издеваетесь?..
Почему такая реакция? Улыбающийся Да, это грязный хак, понимаю что "идет вразрез" и все такое. Ну так показываем где/как это заклинит.
O___o

Ну во-первых:
Код
C++ (Qt)
struct CTest {
CTest( int & ref ) : mRef(ref) {}
 
я не понял: при создании CTest, ref - ещё не готова.. Чего вы туда (в конструктор) передавать будете?

Во-вторых:
Код
C++ (Qt)
void SetRef( int & ref ) { (&mDummy)[1] = &ref; }
 
// data
void * mDummy;
 
Какой смысл в этом извращении?

Записан

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

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

Сообщений: 2095



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

Например, в том примере rew - это всего лишь обёртка над указателем.. Конечно, всякие shared_ptr и reference_wrapper там излишни (это я в надежде получить Шнобелевскую премию) прикрутил..

Но по сути, идея была в более безопасной альтернативе указателю.. Эта обёртка, если так можно сказать, имитирует ссылку с возможностью отложенной инициализацией.

Вот упрощённый её вариант:
Код
C++ (Qt)
template <class T>
class rew
{
public:
   rew() : ptr(0) {}
   void set(T & a) { ptr = &a; }
   T& operator()() { return *ptr; }
   operator bool() const { return ptr; }
 
private:
   T* ptr;
};
 

И вместо того, чтобы в Вашем классе A использовать голый указатель, используете rew
Код
C++ (Qt)
class A
{
public:
   void setData(int & data) { mData.set(data); }
 
   void someMethod() {
       if (!mData) return;
 
       mData() += 123;
       std::cout << mData() << std::endl;
   }
 
private:
   rew<int> mData;
   int mOther;
};
 

И здесь нет конструктора A(int &).. и, соответственно, нет необходимости инициировать пока ещё не готовые данные..

Но, вообще, почти уверен, что подобные вопросы скорее следствие кривой архитектуры..
« Последнее редактирование: Февраль 09, 2013, 17:53 от m_ax » Записан

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

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

Сообщений: 4350



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

Какой смысл в этом извращении?
Никакого.

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

Сообщений: 2095



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

Какой смысл в этом извращении?
Никакого.
Ой, не знаю, не знаю  Подмигивающий
Записан

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

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

Сообщений: 4350



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

Ой, не знаю, не знаю  Подмигивающий
Думаете идет работа по дискредитации ссылок в глазах общественности? Улыбающийся

А вообще, это попытка обойти то, ради чего ссылки были задуманы (по крайней мере, одной из целей).
« Последнее редактирование: Февраль 09, 2013, 18:07 от Old » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Ой, не знаю, не знаю  Подмигивающий
Думаете идет работа по дискредитации ссылок в глазах общественности? Улыбающийся

А вообще, это пример желания обойти то, ради чего ссылки были задуманы.

Однажды на уроке рисования, учительница смешала два цвета: синий и жёлтый и получился зелёный.. Мы подумали, что она ведьма и сожгли её на костре  Улыбающийся
Записан

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

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


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