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

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

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

Сообщений: 11445


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

Добрый день

Код
C++ (Qt)
class A {
A( int & data ) : mData(data) {}
 
int & mData;
int mOther;
};
Теперь я хочу создать объект класса A из потока/файла. Сконструировать его просто так я не могу, нужно иметь data. Но по каким-то причинам у меня (пока) нет data на которые ссылается A, напр он записан в файле позже/дальше. Я могу создать A пока с каким-то фуфлом а потом (когда образовался data) присвоить, но это коряво. Рекомендация "использовать указатель вместо ссылки и не морочить голову" понятна, но как сделать грамотно?

Спасибо
Записан
alexis031182
Гость
« Ответ #1 : Февраль 09, 2013, 13:14 »

С мастодонтами мне не тягаться, просто, если позволите, моё виденье.

По сути, сама идея ссылки говорит о том, что данные нужного типа и в общем-то корректны. Иначе преимущества от её (ссылки) использования теряются, и, как Вы точно подметили, проще ограничиться указателем. В таком случае загонять в data "левые" данные получается идеологически неверно.

Тогда варианты:
1. использовать функтор для отложенного создания объекта класса A. Если класс A может работать и без data (выполнять какую-то часть общего функционала, тогда в нём мог бы быть метод, конструирующий свою копию, но уже с указанием ссылки на data). Если имеются ещё классы, наподобие A, тогда удобно использовать фабрику (молчу про шаблоны);

2. использовать обёртку для A, имеющую функционал A, но с возможностью работы без data.

Как-то так.
Записан
Akon
Гость
« Ответ #2 : Февраль 09, 2013, 13:18 »

Вот как поступаю я в таких случаях. Грамотность заключается в комментарии к указателю Улыбающийся.
Код:
class ReadOnlySegmentTreeModel : public QAbstractItemModel
{
public:
explicit ReadOnlySegmentTreeModel(const Segment& rootSegment, QObject* parent = 0);
           ............

private:
const Segment* rootSegment_;  // acts as reassigned reference

};
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

С мастодонтами мне не тягаться,
Хз что то за "мастодонты", читаем
Цитировать
Мастодо́нты (лат. Mammutidae) — семейство вымерших млекопитающих из отряда Хоботные (Proboscidea). Также мастодонтами часто называют представителей семейства Гомфотериевые (Gomphotheriidae). Мастодонты отличаются от мамонтов и ныне живущих слонов (тоже хоботных, но из семейства Elephantidae) по ряду признаков, из которых наиболее существенные связаны со строением зубов. У мастодонтов на жевательной поверхности моляров (коренных зубов) находится ряд парных соскообразных бугров. Само название этих животных происходит от греческих слов μαστός «сосок» и ὀδούς «зуб». В отличие от них, у мамонтов и слонов на молярах расположен ряд поперечных гребней, разделенных цементом. У многих мастодонтов и на верхней, и на нижней челюсти вторые резцы были превращены в бивни (а у некоторых представителей семейства Гомфотериевые нижние бивни были лопатообразными и использовались для рытья). Мастодонты были растительноядными — одни виды объедали ветки деревьев и кустарников, другие в процессе эволюции все более переходили на питание травой.
Какое отношение это имеет к ссылкам  Непонимающий Непонимающий Может это такой тонкий намек что пора "переходить на питание травой" (ну указателями то есть)?  Улыбающийся

Вот как поступаю я в таких случаях. Грамотность заключается в комментарии к указателю Улыбающийся.
Ну так и я могу. А где же "концептуальная чистота" и все такое?  Улыбающийся
Записан
alexis031182
Гость
« Ответ #4 : Февраль 09, 2013, 13:52 »

Хз что то за "мастодонты", читаем
...
Какое отношение это имеет к ссылкам  Непонимающий Непонимающий Может это такой тонкий намек что пора "переходить на питание травой" (ну указателями то есть)?  Улыбающийся
Я не злобливо и, думаю, Вы прекрасно поняли, что я хотел сказать этим словом. Так что Ваш сарказм ни к чему. А по части предложенных мною вариантов у Вас имеются соображения? И если да, то надеюсь, что они не столь неадекватны, как в случае с темой фауны.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



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

Код:
	explicit ReadOnlySegmentTreeModel(const Segment& rootSegment, QObject* parent = 0);

Так а что передавать конструктору в качестве rootSegment (которого пока нет, он еще не загружен)? "Какое-то фуфло"? Улыбающийся
Записан

Пока сам не сделаешь...
Akon
Гость
« Ответ #6 : Февраль 09, 2013, 13:55 »

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

Сообщений: 2094



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

Добрый день

Код
C++ (Qt)
class A {
A( int & data ) : mData(data) {}
 
int & mData;
int mOther;
};
Теперь я хочу создать объект класса A из потока/файла. Сконструировать его просто так я не могу, нужно иметь data. Но по каким-то причинам у меня (пока) нет data на которые ссылается A, напр он записан в файле позже/дальше. Я могу создать A пока с каким-то фуфлом а потом (когда образовался data) присвоить, но это коряво. Рекомендация "использовать указатель вместо ссылки и не морочить голову" понятна, но как сделать грамотно?

Спасибо

Скорее больше похоже на: Как сделать правильный костыль)
Записан

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

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

Сообщений: 2094



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

Вот костыль от меня) (надеюсь когда-нибудь получу от Igor Шнобелевскую премию по программированию Строит глазки )

Код
C++ (Qt)
template <class T>
class rew
{
public:
   void set(T & a) { ptr = std::make_shared<std::reference_wrapper<T>>(a); }
   T& operator()() { return ptr->get(); }
   operator bool() const { return bool(ptr); }
 
private:
   std::shared_ptr<std::reference_wrapper<T>> ptr;
};
 
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;
};
 
int main()
{
   int a = 2;
   A test;
 
   test.setData(a);
   test.someMethod();
 
   std::cout << a << std::endl;
 
 
   return 0;
}
 
 
Записан

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

Arch Linux Plasma 5
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



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

надеюсь когда-нибудь получу от Igor Шнобелевскую премию по программированию Строит глазки
Обязательно получите! Улыбающийся
Шаблоны есть? Есть. Ссылки вместо указателей? А как иначе! Даже shared_ptr есть в комплекте с reference_wrapper. И самое главное: ни фига не понятно! Как с этим жить и как поддерживать. За что отдельный бонус от Igors Улыбающийся.
« Последнее редактирование: Февраль 09, 2013, 14:43 от ViTech » Записан

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

Сообщений: 11445


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

Так что Ваш сарказм ни к чему. А по части предложенных мною вариантов у Вас имеются соображения? И если да, то надеюсь, что они не столь неадекватны, как в случае с темой фауны.
Не сарказм, а мягкий юмор Улыбающийся По поводу Ваших вариантов

1. использовать функтор для отложенного создания объекта класса A.
...
2. использовать обёртку для A, имеющую функционал A, но с возможностью работы без data.
Вы сами верите в их реальность/практичность? Улыбающийся Это ж тонна проблем на ровном месте. Только создать промежуточный класс/функтор для каждого чего стоит

Какая чистота? Ссылка - это объект (языковой), который может быть только инициализирован. Если же вам нужно дальнейшее присваивание - то это не для ссылки по определению. Поэтому, либо используйте указатель, либо ссылку, но будьте добры предоставить готовые данные.
То есть если маячит (де)сериализация - использования ссылки лучше избегать, т.к. оно уже оказалось "идеологически неверным"?

Вот костыль от меня) (надеюсь когда-нибудь получу от Igor Шнобелевскую премию по программированию Строит глазки )
Код
C++ (Qt)
   void set(T & a) { ptr = std::make_shared<std::reference_wrapper<T>>(a); }
 
Круто (червона рута). А такой (стариковский) костыль?
Код
C++ (Qt)
class A {
...
void SetRef( int & ref ) { (&mDummy)[1] = &ref; }
 
 void * mDummy;
 int & mData;
};
 

Обязательно получите! Улыбающийся
Шаблоны есть? Есть. Ссылки вместо указателей? А как иначе! Даже shared_ptr есть в комплекте с reference_wrapper. И самое главное: ни фига не понятно! Как с этим жить и как поддерживать. За что отдельный бонус от Igors Улыбающийся.
Не надо вводить общественность в заблуждение Улыбающийся Я вполне хорошо отношусь ко всему что Вы перечислили - но только если это соответствует решаемой задаче. А так это (мягко) называется "накрутил"  Улыбающийся
Записан
alexis031182
Гость
« Ответ #11 : Февраль 09, 2013, 15:18 »

Не сарказм, а мягкий юмор Улыбающийся По поводу Ваших вариантов

1. использовать функтор для отложенного создания объекта класса A.
...
2. использовать обёртку для A, имеющую функционал A, но с возможностью работы без data.
Вы сами верите в их реальность/практичность? Улыбающийся Это ж тонна проблем на ровном месте. Только создать промежуточный класс/функтор для каждого чего стоит
Если функторы в фабрике, и если конечно типов объектов, вроде A, много всяких разных, то особо и ничего. А для одного только A этот вариант избыточен, безусловно.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



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

Круто (червона рута). А такой (стариковский) костыль?
Код
C++ (Qt)
class A {
...
void SetRef( int & ref ) { (&mDummy)[1] = &ref; }
 
 void * mDummy;
 int & mData;
};
 

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


Записан

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

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

Сообщений: 2094



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

надеюсь когда-нибудь получу от Igor Шнобелевскую премию по программированию Строит глазки
Обязательно получите! Улыбающийся
Шаблоны есть? Есть. Ссылки вместо указателей? А как иначе! Даже shared_ptr есть в комплекте с reference_wrapper. И самое главное: ни фига не понятно! Как с этим жить и как поддерживать. За что отдельный бонус от Igors Улыбающийся.

Да вот, похоже, что нет((

И вообще, мне тут думается, что igors просто сидит и глумится сейчас над нами) Эта тема, как некое ответвление темы про сериализацию..
Готов поспорить, что в конце мы услышим от автора: Да это же была намеренная провокация, так изящно развёрнутая мной)   

Записан

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

Arch Linux Plasma 5
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



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

И вообще, мне тут думается, что igors просто сидит и глумится сейчас над нами) Эта тема, как некое ответвление темы про сериализацию..
Готов поспорить, что в конце мы услышим от автора: Да это же была намеренная провокация, так изящно развёрнутая мной)
И в конце обязательно покажет правильный способ сериализации всея объектов во всея форматы Улыбающийся.
Записан

Пока сам не сделаешь...
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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