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

Поиск:

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


Эксперт
***


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

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



Почему такой код

Код

#include <sstream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    ostringstream o;
    throw o;
}


вызывает такие ошибки

Error    1    error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'    c:\program files\microsoft visual studio 9.0\vc\include\sstream    451    Test_ostringstream
Error    2    error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'    c:\program files\microsoft visual studio 9.0\vc\include\ostream    584    Test_ostringstream

?

PM MAIL   Вверх
Lazin
Дата 4.3.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



почитай о требованиях к классу исключения, исключение должно иметь конструктор копирования и оператор присваивания
PM MAIL Skype GTalk   Вверх
Dims
Дата 4.3.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А как можно это обойти в данном случае?

И почему я могу throw-ить произвольный свой класс без таких операторов?

Вот так работает:

Код

#include <sstream>
using namespace std;

class A {

    int value;
};



int _tmain(int argc, _TCHAR* argv[])
{
    ostringstream o;
    A a;

    //throw o;
    throw a;
}

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


Опытный
**


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

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



А можно через проверку?
Код

if( o. ...... )  //проверить что-то
     throw "Some error";

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


Кодофей
****


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

Репутация: 10
Всего: 33



Цитата(TGrey @  4.3.2010,  19:57 Найти цитируемый пост)
А можно через проверку?

можно.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 4.3.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Dims @  4.3.2010,  18:46 Найти цитируемый пост)
И почему я могу throw-ить произвольный свой класс без таких операторов?

потому что у исключения другое время жизни, нежели у переменной определенной в блоке,
ну а чтоб задать новую длину жизни необходимо уметь копировать его, о чем и сказано в цитате Lazin`a
 smile

Цитата(Dims @  4.3.2010,  18:46 Найти цитируемый пост)
Вот так работает:

Потому что имеются нужные операторы .. некоторые операторы добавляются скрыто в случае если не определены программистом..
те что требуются относятся к числу подобных.




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


Эксперт
***


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

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



Непонятно.


Во-первых, какими образом и с какой целью достигнуто, чтобы ostringstream нельзя было копировать?

Во-вторых, почему тогда вот это компилируется нормально:

Код

int _tmain(int argc, _TCHAR* argv[])
{
    ostringstream o;
    ostringstream o1;
    
    o1 = ostringstream(o);
    

    // throw o;
    // throw a;
}

PM MAIL   Вверх
Lazin
Дата 4.3.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(Dims @  4.3.2010,  19:46 Найти цитируемый пост)
И почему я могу throw-ить произвольный свой класс без таких операторов?

потому что компилятор, заботливо делает это за тебя
PM MAIL Skype GTalk   Вверх
mes
Дата 4.3.2010, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Dims @  4.3.2010,  19:02 Найти цитируемый пост)
Во-первых, какими образом .. чтобы ostringstream нельзя было копировать?

компилятор же говорит :
Цитата(Dims @  4.3.2010,  14:09 Найти цитируемый пост)
: cannot access private member



Цитата(Dims @  4.3.2010,  19:02 Найти цитируемый пост)
и с какой целью достигнуто, 

для того чтоб исключить возможное копирование smile

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

Цитата(Dims @  4.3.2010,  19:02 Найти цитируемый пост)
Во-вторых, почему тогда вот это компилируется нормально:

а это вопрос к VS  smile 


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Dims, а ты попробуй такой код:
Код
class A
{
   A(const A&);
public:
   A(){}
};

int main()
{
   A a;
   throw a;
}
и такой:
Код
class A
{
   A(const A&);
public:
   A(){}
};

int main()
{
   A a;
   A b;
   a = b;
}
И еще такой:
Код
class A
{
   A(const A&);
public:
   A(){}
};

int main()
{
   A a = A();
}
И попробуй объяснить результат.

Это сообщение отредактировал(а) bsa - 5.3.2010, 01:09
PM   Вверх
mes
Дата 4.3.2010, 20:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(bsa @  4.3.2010,  19:38 Найти цитируемый пост)
И попробуй объяснить результат. 

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



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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(mes @  4.3.2010,  20:42 Найти цитируемый пост)
надо ко всем классам имеющим закрытый констуктор копий добавить открытый конструктор по умолчанию.
исправил. спасибо. (стормозил, писал и думал, что что-то забыл  smile )

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


Эксперт
***


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

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



Цитата(bsa @  4.3.2010,  20:38 Найти цитируемый пост)
Dims, а ты попробуй такой код:


Первый пример: ругается линкер: Error    1    error LNK2001: unresolved external symbol "private: __thiscall A::A(class A const &)" (??0A@@AAE@ABV0@@Z)    Test_ostringstream.obj    Test_ostringstream


Ошибка понятна: конструктор объявлен, вызывается, но не определён.

Второй пример: не ругается. Понятно: хотя конструктор не определён, но он и не используется.

Третий пример: ругается компилятор: Error    1    error C2248: 'A::A' : cannot access private member declared in class 'A'

А какое это имеет отношения к моему примеру?

Добавлено через 3 минуты и 28 секунд
Ребят, скажите пожалуйста, откуда вообще всплыла эта тема? 

Судя по моей проверке вот тут: http://forum.vingrad.ru/index.php?showtopi...t&p=2109522

В классе ostringstream присутствуют и доступны как конструктор копирования по ссылке, так и оператор присваивания. Поэтому почему вы думаете, что дело в их отсутствии?
PM MAIL   Вверх
mes
Дата 5.3.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Dims @  5.3.2010,  15:53 Найти цитируемый пост)
А какое это имеет отношения к моему примеру?    

неужто не замечаете сходства ?

Цитата(Dims @  4.3.2010,  14:09 Найти цитируемый пост)
 error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member ...

Цитата(Dims @  5.3.2010,  15:53 Найти цитируемый пост)
 error C2248: 'A::A' : cannot access private member declared in class 'A'

 smile 


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


Эксперт
***


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

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



Действительно, на Юниксе мой пример не компилируется...

Добавлено через 1 минуту и 20 секунд
Цитата(mes @  5.3.2010,  16:57 Найти цитируемый пост)
неужто не замечаете сходства ?

Я не замечаю сходства в коде, который вызвал эту ошибку. Код со throw вызвал другую.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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