Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему я не могу throw объект типа ostringstream? 
:(
    Опции темы
Dims
Дата 6.3.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Цитата(mes @  6.3.2010,  12:54 Найти цитируемый пост)
Никакого вызова копи-конструктора макросом не происходит, только проверяется его доступность.  


Хорошо, Вы правы, проверяется доступность. Но конструктор явно упоминается в выражении. Пример полностью аналогичен нижеследующему:

Код

struct A {
 private:
     int field;
};
struct B : A {
    void method()
    { 
        sizeof(field); // палец указывает сюда
    }
};
int main (){ 
}


То есть, вы просто пытаетесь получить свойство члена, вам недоступного. Тут ни причём копирующие конструкторы и throw. Такой код всегда будет вызывать ошибку. И место, в котором это происходит, можно указать пальцем (см. комментарий).

Можете проделать то же самое с моим примером с ostringstream?
PM MAIL   Вверх
mes
Дата 6.3.2010, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Dims @  6.3.2010,  13:38 Найти цитируемый пост)
Пример полностью аналогичен нижеследующему:

с той лишь разностью, что в Вашем случае проверка осуществляется программистом, а в моем компилятором, и мой код лишь грубая иллюстрация проверки.
smile

Цитата(Dims @  6.3.2010,  13:38 Найти цитируемый пост)
Можете проделать то же самое с моим примером с ostringstream? 

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


Это сообщение отредактировал(а) mes - 6.3.2010, 16:17


--------------------
PM MAIL WWW   Вверх
Dims
Дата 6.3.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Я нашёл, в чём глюк. Ниже код.

Классы D и E оба наследуют от A (причём, D делает это косвенно и имея A виртуальным предком). В A конструктор копирования приватный (для всех), но это не мешает копировать и присваивать как D, так и E, так как в них определены свои конструкторы. Однако, стоит применить throw, возникает ошибка, причём только для класса D.

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

Код

struct A {
   A() { }
 private:
   A(const A&) {  }
};

struct B : virtual public A {
    B()  : A() {}
};

struct C : virtual public A {
    C()  : A() {}
};

struct D : public C, public B {
    D() : C(), B() {}
    D(const D&) : C(), B() {}
    D& operator=(const D& ano) {}
};

struct E : public A {
    E() : A() {}
    E(const E&) : A() {}
    E& operator=(const E& ano) {}
};

int main (){ 

    D d1;
    D d2(d1);
    // throw d1; // error if uncomment this

    E e1;
    E e2(e1);
    throw e1;
}


Добавлено через 7 минут и 43 секунды
P.S. Конечно, я забыл return *this; в операторе присваивания...

Проверка компилятором codepad подтверждает гипотезу, что я напал на след: http://codepad.org/Otzbacg6

Компилятор тут показывает ошибку точнее, чем VS, но и здесь ошибочным является только код D, но не E.

Осталось ещё разобраться, как удовлетворить "should be explicitly initialized in the copy constructor", ну и понять, откуда это требование возникает...

Добавлено через 9 минут и 7 секунд
Цитата(mes @  6.3.2010,  16:12 Найти цитируемый пост)
с той лишь разностью, что в Вашем случае проверка осуществляется программистом, а в моем компилятором

Не понял. Обоснуйте это утверждение.

PM MAIL   Вверх
mes
Дата 6.3.2010, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



...

Это сообщение отредактировал(а) mes - 6.3.2010, 19:23


--------------------
PM MAIL WWW   Вверх
mes
Дата 6.3.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



перечитал еще раз топик, вроде разобрался где свернули в разные стороны. smile
сейчас объясню.

Добавлено @ 19:15
Цитата(Dims @  5.3.2010,  19:04 Найти цитируемый пост)
О, чё на сайте говорит: http://codepad.org/8pIjcxuu 

вот тут Вас интересует почему возникает ошибка компиляции, а не почему так нельзя делать.

Цитата

Осталось ещё разобраться, как удовлетворить "should be explicitly initialized in the copy constructor"

Цитата

12.6.2/5 Initialization shall proceed in the following order:
— First, and only for the constructor of the most derived class as described below, virtual base classes shall
be initialized in the order they appear on a depth-first left-to-right traversal of the directed acyclic graph
of base classes, where “left-to-right” is the order of appearance of the base class names in the derived
class base-specifier-list.
— Then, direct base classes shall be initialized in declaration order as they appear in the base-specifier-list
(regardless of the order of the mem-initializers).
— Then, nonstatic data members shall be initialized in the order they were declared in the class definition
(again regardless of the order of the mem-initializers).
— Finally, the body of the constructor is executed.

вот теперь компилируется : http://codepad.org/dSptN7Fb, 
 но за работоспособность не ручаюсь - не настолько хорошо знаю язык ,
в душе и  по обоснованиям изложенных выше полагаю что ill formed 
 smile

ответ устраивает или я опять не на то ответил ? smile

Это сообщение отредактировал(а) mes - 6.3.2010, 19:20


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0455 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.