Здравствуйте, Goryh, Вы писали:
G>В данный момент, когда используется this, объект А еще не сконструирован, поэтому указатель не представляет G>из себя валидного значения, скорее всего, это просто мусор.
Позволю себе не согласиться. В указателе лежит вполне валидное значение. А вот сам объект действительно не сконструирован. Максимум, что должен сказать компилятор — выдать предупреждение. VC7.0, VC7.1 так и делают. Comeau вообще без предупреждений компилит. Если VC6 совсем не компилит — значит это баг компилятора.
Здравствуйте, <Аноним>, Вы писали:
А>Почему VC++ 6 не позволяет передавать this в указанном месте? А>
А>class A;
А>class B {
А> A *m_pa;
А>public:
А> B(A *pa) : m_pa(pa) { }
А>};
А>class A {
А> B m_b;
А>public:
А> A() : m_b(this) { } // здесь
А>}
А>
В данный момент, когда используется this, объект А еще не сконструирован, поэтому указатель не представляет
из себя валидного значения, скорее всего, это просто мусор.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
this при инициализации члена класса
От:
Аноним
Дата:
16.04.05 05:33
Оценка:
Почему VC++ 6 не позволяет передавать this в указанном месте?
class A;
class B {
A *m_pa;
public:
B(A *pa) : m_pa(pa) { }
};
class A {
B m_b;
public:
A() : m_b(this) { } // здесь
}
Здравствуйте, <Аноним>, Вы писали:
А>Почему VC++ 6 не позволяет передавать this в указанном месте? А>
А>class A;
А>class B {
А> A *m_pa;
А>public:
А> B(A *pa) : m_pa(pa) { }
А>};
А>class A {
А> B m_b;
А>public:
А> A() : m_b(this) { } // здесь
А>}
А>
Во-первых, у вас отсутствует запятая после обьявления класса A.
Во-вторых, немного не понял: this это указатель, а m_b это ж просто обьект?
MinGW правда всё скомпилил..
Таким образом это "причуды" VC6.
Здравствуйте, Вадим Никулин, Вы писали:
ВН>Здравствуйте, Goryh, Вы писали:
G>>В данный момент, когда используется this, объект А еще не сконструирован, поэтому указатель не представляет G>>из себя валидного значения, скорее всего, это просто мусор.
ВН>Позволю себе не согласиться. В указателе лежит вполне валидное значение. А вот сам объект действительно не сконструирован. Максимум, что должен сказать компилятор — выдать предупреждение. VC7.0, VC7.1 так и делают. Comeau вообще без предупреждений компилит. Если VC6 совсем не компилит — значит это баг компилятора.
Чтобы не быть голословным — все это описано в пункте 12.7 стандарта.
Здравствуйте, Аноним, Вы писали:
А>Почему VC++ 6 не позволяет передавать this в указанном месте?
У меня VC6sp6 всё компилирует (про }; тебе уже сказали).
Ищи проблемы в другом месте. А может быть, ты привёл код, не эквивалентный проблемному.
Перекуём баги на фичи!
Re[2]: this при инициализации члена класса
От:
Аноним
Дата:
16.04.05 16:52
Оценка:
А>>Почему VC++ 6 не позволяет передавать this в указанном месте? К>У меня VC6sp6 всё компилирует (про }; тебе уже сказали). К>Ищи проблемы в другом месте. А может быть, ты привёл код, не эквивалентный проблемному.
Точку с запятой случайно пропустил когда набирал пример. Код действительно совсем не этот но смысл тот же. В классе производном от CView хотел создать объект для modeless диалога и передавал туда адрес "владельца." Не помню уже даже что компилятор выдал мне (ошибку или предупреждение — скорее всего второе) но думаю что "ему не понравилось" что я передаю адрес на еще не созданный объект хотя this, как верно заметил Вадим Никулен, валиден, и я не обращался к "владельцу" из конструктора modeless диалога.
Скорее всего компилятор предостерег против возможности обратиться к несконструированному объекту из конструктора диалога.
Благодарю всех ответивших на мой вопрос!!! Код переписал чуточку по-другому.
Re[4]: this при инициализации члена класса
От:
Аноним
Дата:
16.04.05 16:59
Оценка:
ВН>Чтобы не быть голословным — все это описано в пункте 12.7 стандарта.
Ламерский вопрос. Вы всегда обращаетесь к Страуструпу или этот стандарт доступен он-лайн? Если второе, то можно ссылку?
Здравствуйте, <Аноним>, Вы писали:
ВН>>Чтобы не быть голословным — все это описано в пункте 12.7 стандарта. А>Ламерский вопрос. Вы всегда обращаетесь к Страуструпу или этот стандарт доступен он-лайн? Если второе, то можно ссылку?