Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, IROV.., Вы писали:
IRO>>Писать
IRO>>: bar(this->foo)
IRO>>Тогда получишь варнинг
A>очевидно это не тот варнинг
Тот-тот, он как раз и предупреждает программиста о том что — по мнению компилятора, мы здесь используем непроинициализированый указатель(this), и добром это не кончеться.
A>еще можно написать "bar(!@#$%^)" и получить error
как щас модно говорить в геймерских кругах, "удали студию"
2.
У меня в кодестайле прописано, что в конструкторах нельзя выполнять функции.
Если нужно пишем — initialize, если до, значит нужен какойто менеджер.
Здравствуйте, IROV.., Вы писали:
IRO>Ну я именно это и хотел сказать, что дело не в порядке, а вообще в том что мы используем(разыменовываем) неготовый указатель.
никакого разыменования (использования) там нет, вариант с this-> ты придумал сам.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, IROV.., Вы писали:
IRO>>Ну я именно это и хотел сказать, что дело не в порядке, а вообще в том что мы используем(разыменовываем) неготовый указатель. Х>никакого разыменования (использования) там нет, вариант с this-> ты придумал сам.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, IROV.., Вы писали:
IRO>>Ну я именно это и хотел сказать, что дело не в порядке, а вообще в том что мы используем(разыменовываем) неготовый указатель. Х>никакого разыменования (использования) там нет, вариант с this-> ты придумал сам.
Как это нет??!
struct Bar
{
Bar(Foo & f)
{
//...f.load();//а это что?
}
};
Здравствуйте, Abyx, Вы писали:
A>Сейчас где-то час потратил на то чтобы найти баг в следующем коде:
A>
A>#include <vector>
A>struct Foo
A>{
A> Foo() {}
A> void load(/*...*/)
A> {
A> v.clear(); // тут возникает assert "итераторы несовместимы"
A> }
A> std::vector<int> v;
A>};
A>struct Bar
A>{
A> Bar(Foo& f)
A> {
A> //...
A> f.load(/*...*/);
A> }
A>};
A>struct Holder
A>{
A> Holder()
A> : bar(foo)
A> , foo()
A> {}
A> Bar bar;
A> Foo foo;
A>};
A>int main()
A>{
A> Holder h;
A>}
A>
я вообще не об этом говорю, я говорю о том что использование проинициализированных полей объекта до полной инициализации самого объекта не является UB, как в этом пытается убедить нас IROV.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, wander, Вы писали:
W>>Как это нет??!
Х>я вообще не об этом говорю, я говорю о том что использование проинициализированных полей объекта до полной инициализации самого объекта не является UB, как в этом пытается убедить нас IROV.
Так тут как раз используется непроинициализированное. Что касается выделенного, мне не кажется, что он в этом пытается нас убедить.
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, martin, Вы писали:
M>>Посмотри в сторону boost::base_from_member.
A>посмотрел и не понял что вы хотите предложить.
Насколько я понимаю, в вашем примере проблема в том что bar пытается использовать объект foo который еще не создан. Проблему конечно можно избежать поменяв местами объявления членов bar и foo класса Holder. Тогда все будет ок. Но в будущем нельзя гарантировать что кто-нибудь их опять не поменяет случайно местами. Самое правильное, на мой взгляд, это сделать гарантированный вызов конструктора foo перед вызовом конструктора bar. Этого можно добиться с использованием наследования.