Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Февраль 09, 2013, 12:14



Название: Изменить ссылку (?)
Отправлено: Igors от Февраль 09, 2013, 12:14
Добрый день

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

Спасибо


Название: Re: Изменить ссылку (?)
Отправлено: alexis031182 от Февраль 09, 2013, 13:14
С мастодонтами мне не тягаться, просто, если позволите, моё виденье.

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

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

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

Как-то так.


Название: Re: Изменить ссылку (?)
Отправлено: Akon от Февраль 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

};


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

Вот как поступаю я в таких случаях. Грамотность заключается в комментарии к указателю :).
Ну так и я могу. А где же "концептуальная чистота" и все такое?  :)


Название: Re: Изменить ссылку (?)
Отправлено: alexis031182 от Февраль 09, 2013, 13:52
Хз что то за "мастодонты", читаем
...
Какое отношение это имеет к ссылкам  ??? ??? Может это такой тонкий намек что пора "переходить на питание травой" (ну указателями то есть)?  :)
Я не злобливо и, думаю, Вы прекрасно поняли, что я хотел сказать этим словом. Так что Ваш сарказм ни к чему. А по части предложенных мною вариантов у Вас имеются соображения? И если да, то надеюсь, что они не столь неадекватны, как в случае с темой фауны.


Название: Re: Изменить ссылку (?)
Отправлено: ViTech от Февраль 09, 2013, 13:54
Код:
	explicit ReadOnlySegmentTreeModel(const Segment& rootSegment, QObject* parent = 0);

Так а что передавать конструктору в качестве rootSegment (которого пока нет, он еще не загружен)? "Какое-то фуфло"? :)


Название: Re: Изменить ссылку (?)
Отправлено: Akon от Февраль 09, 2013, 13:55
Какая чистота? Ссылка - это объект (языковой), который может быть только инициализирован. Если же вам нужно дальнейшее присваивание - то это не для ссылки по определению. Поэтому, либо используйте указатель, либо ссылку, но будьте добры предоставить готовые данные.


Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 09, 2013, 14:12
Добрый день

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

Спасибо

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


Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 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;
}
 
 


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


Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 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 :).
Не надо вводить общественность в заблуждение :) Я вполне хорошо отношусь ко всему что Вы перечислили - но только если это соответствует решаемой задаче. А так это (мягко) называется "накрутил"  :)


Название: Re: Изменить ссылку (?)
Отправлено: alexis031182 от Февраль 09, 2013, 15:18
Не сарказм, а мягкий юмор :) По поводу Ваших вариантов

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


Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 09, 2013, 15:20
Круто (червона рута). А такой (стариковский) костыль?
Код
C++ (Qt)
class A {
...
void SetRef( int & ref ) { (&mDummy)[1] = &ref; }
 
 void * mDummy;
 int & mData;
};
 

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




Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 09, 2013, 15:25
надеюсь когда-нибудь получу от Igor Шнобелевскую премию по программированию ::)
Обязательно получите! :)
Шаблоны есть? Есть. Ссылки вместо указателей? А как иначе! Даже shared_ptr есть в комплекте с reference_wrapper. И самое главное: ни фига не понятно! Как с этим жить и как поддерживать. За что отдельный бонус от Igors :).

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

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



Название: Re: Изменить ссылку (?)
Отправлено: ViTech от Февраль 09, 2013, 15:35
И вообще, мне тут думается, что igors просто сидит и глумится сейчас над нами) Эта тема, как некое ответвление темы про сериализацию..
Готов поспорить, что в конце мы услышим от автора: Да это же была намеренная провокация, так изящно развёрнутая мной)
И в конце обязательно покажет правильный способ сериализации всея объектов во всея форматы :).


Название: Re: Изменить ссылку (?)
Отправлено: Bepec от Февраль 09, 2013, 15:47
Не "покажет", а скажет - смотрите в "ННН" и делайте сами :D

PS интересные провокации из "ничего".


Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 09, 2013, 15:58
Это правильный костыль.. Очень правильный) С таким запросто можно и вторую ногу себе отстрелить  :)
Прошу показать каким образом


Название: Re: Изменить ссылку (?)
Отправлено: ViTech от Февраль 09, 2013, 16:06
Не "покажет", а скажет - смотрите в "ННН" и делайте сами :D
"ННН"... зачем Вы так буст зашифровали? :)


Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 09, 2013, 16:11
Это правильный костыль.. Очень правильный) С таким запросто можно и вторую ногу себе отстрелить  :)
Прошу показать каким образом

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

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


Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 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


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 09, 2013, 16:41
В принципе меня это вполне устраивает. Но бы здОрово как-то избавиться от mDummy
Не в коем случае! Не нужно портить этот шедевр.  ::)


Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 09, 2013, 16:42
Igors, Вы что, издеваетесь?)

Или я похоже уже совсем перестал понимать, что происходит)


Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 09, 2013, 16:51
Не в коем случае! Не нужно портить этот шедевр.  ::)
Igors, Вы что, издеваетесь?..
Почему такая реакция? :) Да, это грязный хак, понимаю что "идет вразрез" и все такое. Ну так показываем где/как это заклинит.


Название: Re: Изменить ссылку (?)
Отправлено: Bepec от Февраль 09, 2013, 17:01
Проще выражаясь, Igors создаёт проблему, просит решение.

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

Примерно так это видится в моих глазах :D


Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 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;
 
Какой смысл в этом извращении?



Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 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 &).. и, соответственно, нет необходимости инициировать пока ещё не готовые данные..

Но, вообще, почти уверен, что подобные вопросы скорее следствие кривой архитектуры..


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 09, 2013, 17:48
Какой смысл в этом извращении?
Никакого.

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


Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 09, 2013, 18:00
Какой смысл в этом извращении?
Никакого.
Ой, не знаю, не знаю  ;)


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 09, 2013, 18:02
Ой, не знаю, не знаю  ;)
Думаете идет работа по дискредитации ссылок в глазах общественности? :)

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


Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 09, 2013, 18:08
Ой, не знаю, не знаю  ;)
Думаете идет работа по дискредитации ссылок в глазах общественности? :)

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

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


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

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

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

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

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


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 09, 2013, 19:09
Перечитайте еще раз это:
Ну вот я задумываю класс A и четко вижу что mData должен всегда существовать, иначе смысла нет.

Это ответ на все ваши вопросы.


Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 09, 2013, 19:27
Это ответ на все ваши вопросы.
Не вижу ответа на главный
Так что, я должен "поступиться принципами" и бежать менять ссылки на указатели? Или как?


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 09, 2013, 19:32
Так что, я должен "поступиться принципами" и бежать менять ссылки на указатели? Или как?
Нет. Нужно вначале получать mData, ссылку на который и передавать при конструировании объекта.
В связи с:
четко вижу что mData должен всегда существовать, иначе смысла нет.


Название: Re: Изменить ссылку (?)
Отправлено: sergek от Февраль 09, 2013, 21:30
Я могу создать A пока с каким-то фуфлом а потом (когда образовался data) присвоить, но это коряво.
Что бы вы ни делали, после создания объекта A ваша ссылка mData всегда будет эквивалентом этого "фуфла". Можно, конечно, этому "фуфлу" присвоить полученное значение data, но вы ведь не этого добиваетесь?
Если цитировать Страуструпа, ссылка является альтернативным именем объекта, ее всегда надо инициализировать, значение ссылки никогда не меняется после инициализации. Т.е. ссылка появляется либо одновременно с объектом, на который она ссылается, либо позже.


Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 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% корректной возможности. Однако я так не сделал, более того, полагаю что и многие другие не делали бы так. Если неясно почему - можно просто спросить (а не писать жирным, а потом еще и красным :))


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

Однако я так не сделал, более того, полагаю что и многие другие не делали бы так.
Первая часть предложения меня уже не удивляет, а вторая вызывает большие сомнения. ;)


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 09, 2013, 23:19
Верно, проcто так не присвоить
Код
C++ (Qt)
test2 = test1;   // так нельзя из-за ссылки в CTest
 
Почему? Или вы имеете ввиду дефолтный оператор присваивания?


Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 10, 2013, 12:10
Почему? Или вы имеете ввиду дефолтный оператор присваивания?
Да, компилятор не пропустит дефолтный, перекрыть можно, но это не поможет со ссылкой

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


Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 10, 2013, 12:20
Проще выражаясь, Igors создаёт проблему, просит решение.
Не припоминаю когда я у Вас хоть что-то "просил" :) Я "предлагаю обсудить" (вот правильное выражение) проблему которая у меня возникла, и которая, может быть, будет интересна другим. Да, я имею право критиковать решения предложенные другими - также как и они мои, это нормально. А если Вам так неймется, то переходите в "ответы на вопросы новичков" - это самый важный раздел форума, недаром он поставлен первым  :)


Название: Re: Изменить ссылку (?)
Отправлено: Bepec от Февраль 10, 2013, 12:26
Жесткая критика и указание недостатков - разные вещи :)

Именно на это я и указываю. Кому - то нравится, наверно, такое отношение. Мне нет.


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 10, 2013, 12:33
Да, было так (когда я задумывал класс). А потом, когда мне понадобилось читать/писать в поток - вроде стало уже и не так :'(
Вот это меня удивляет. Проектирования не было никакого? Что вижу, то пою. :)

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


Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 10, 2013, 12:36
Да, было так (когда я задумывал класс). А потом, когда мне понадобилось читать/писать в поток - вроде стало уже и не так :'(
Вот это меня удивляет. Проектирования не было никакого? Что вижу, то пою. :)

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


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


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 10, 2013, 12:44
Аха.. Только если не менять конструктор, то и указатель уже не поможет)
Почему? При конструировании передавать "фуфло", а дальше править.


Название: Re: Изменить ссылку (?)
Отправлено: m_ax от Февраль 10, 2013, 12:49
Аха.. Только если не менять конструктор, то и указатель уже не поможет)
Почему? При конструировании передавать "фуфло", а дальше править.


А, вон оно что..  :-\


Название: Re: Изменить ссылку (?)
Отправлено: ViTech от Февраль 10, 2013, 13:08
При конструировании передавать "фуфло", а дальше править.
Предвосхищая вопрос: "А где этот фуфло брать? Его же тоже еще нет. Если все фуфлы создавать заранее, то вдруг они не понадобятся, и будут только место занимать.", предлагаю добавить фабрику фуфла: FufloFactory.


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 10, 2013, 13:10
Предвосхищая вопрос: "А где этот фуфло брать? Его же тоже еще нет. Если все фуфлы создавать заранее, то вдруг они не понадобятся, и будут только место занимать.", предлагаю добавить фабрику фуфла: FufloFactory.
Как я понял из первого поста, с этим проблем нет. Все упиралось в правку ссылки.


Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 10, 2013, 14:02
Проектирования не было никакого? Что вижу, то пою. :)
..
Уже если начали приделывать костыли,
Так к чему же в данном случае сводится правильное (не-костыльное) проектирование?
Цитировать
Создавая член-ссылку Вы получаете, нелегкие (как минимум) проблемы с сериализацией этого члена, поэтому лучше ограничиться указателем
Я против этого никак не возражаю о чем сказал еще в первом посте. Верно я понимаю или нет?


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 10, 2013, 16:00
Так к чему же в данном случае сводится правильное (не-костыльное) проектирование?
Не знаю. Вы раскройте предметную область, расскажите что это за класс, что за ссылка и будем думать.



Название: Re: Изменить ссылку (?)
Отправлено: Авварон от Февраль 10, 2013, 19:31
Вы тут о5 какую-то херню обсуждаете.


Название: Re: Изменить ссылку (?)
Отправлено: Bepec от Февраль 10, 2013, 20:00
Авварон - АПЛОДИСМЕНТЫ!


Название: Re: Изменить ссылку (?)
Отправлено: Пантер от Февраль 11, 2013, 09:00
Вы тут о5 какую-то херню обсуждаете.
Вспомни про кота, которому нечем заняться.


Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 11, 2013, 12:11
Так к чему же в данном случае сводится правильное (не-костыльное) проектирование?
Не знаю. Вы раскройте предметную область, расскажите что это за класс, что за ссылка и будем думать.
Член-ссылка уже сам по себе ясно показывает что я не создаю и не удаляю объект на который ссылаюсь - я им просто "пользуюсь". Это нормальная конструкция в любой предметной области, поэтому вывод что мол, "надо по месту смотреть" здесь ни к чему.

Я лично не вижу в использовании указателя (пусть и голого) никакой катастрофы. Ну поменял ссылку на указатель, сериализоваться-то надо. Ну да, ссылка смотрелась лучше, но что поделаешь.

Вы тут о5 какую-то херню обсуждаете.
Вспомни про кота, которому нечем заняться.
На этом (и любом) форуме есть масса тем, на мой взгляд, совершенно глупых и ненужных. Но я держу мое мнение при себе и никому не указываю чего надо или не надо обсуждать.


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 11, 2013, 12:34
Член-ссылка уже сам по себе ясно показывает что я не создаю и не удаляю объект на который ссылаюсь - я им просто "пользуюсь". Это нормальная конструкция в любой предметной области, поэтому вывод что мол, "надо по месту смотреть" здесь ни к чему.
Ну как же ни к чему?
Вы реализуете класс, данные которого раньше не думали сериализовать(!), но в файле они сохраняются раньше, тех данных от которых они зависят. И формат файла вы менять не хотите. Я ничего не пропустил? :)
Я просто очень хочу посмотреть на это.

Я лично не вижу в использовании указателя (пусть и голого) никакой катастрофы. Ну поменял ссылку на указатель, сериализоваться-то надо.
Я тоже.

Ну да, ссылка смотрелась лучше, но что поделаешь.
Как что поделаешь? Сразу продумывать, что сериализовать и в какой последовательности. И ссылки не будут вызывать никаких проблем.



Название: Re: Изменить ссылку (?)
Отправлено: Igors от Февраль 11, 2013, 12:42
Сразу продумывать, что сериализовать и в какой последовательности. И ссылки не будут вызывать никаких проблем.
"ввиду отсутствия таковых" :) А проблемы там все-таки остаются, но это уже др тема


Название: Re: Изменить ссылку (?)
Отправлено: Old от Февраль 11, 2013, 12:47
"ввиду отсутствия таковых" :) А проблемы там все-таки остаются, но это уже др тема
Я уже понял, что у вас со всем проблемы остаются. :)