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

Поиск:

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


Эксперт
****


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

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



Цитата(Dims @  5.3.2010,  17:08 Найти цитируемый пост)
Код со throw вызвал другую. 
А если так:
Код
class A
{
   A(const A&);
public:
   A(){}
};

class B : public A
{
public:
   B(){}
};

int main()
{
   B b;
   throw b;
}

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


Эксперт
***


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

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



Написал нижеследующим образом и получаю всё равно такую же ошибку. Почему?

Код

#include <sstream>
using namespace std;


class A : public ostringstream {

public:
    int myMember;

    A() : ostringstream() {
    }

    A(const A& proto) : ostringstream() {
        (*this) << ((ostringstream *)(&proto))->str();
    }

    A& operator=(const A& proto) {
        str("");
        (*this) << ((ostringstream *)(&proto))->str();
        return *this;
    }

};


int main() {
    A a;
    throw a;
}



Добавлено через 6 минут и 23 секунды
Цитата(bsa @  5.3.2010,  17:20 Найти цитируемый пост)
А если так:


Да, так похоже.

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

Но понятно не всё smile

Почему мой 2-й пример компилируется? Ладно, это особенности ВС.

А почему мой последний не компилируется? Ведь я, вроде, написал что ему надо.
PM MAIL   Вверх
bsa
Дата 5.3.2010, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код
(*this) << ((ostringstream *)(&proto))->str();
Ржунимагу...
Почему нельзя написать так?
Код
*this << proto.str();


И вообще, наследовать подобные классы не есть хорошо. лучше использовать агрегацию:
Код
class A
{
   A() {}
   A(const A &a) { stream_.str( a.stream_.str() ); }
   A& operator=(const A &a) {
       stream_.str( a.stream_.str() );
       return *this;
   }
   template<class T>
   friend A& operator<<(A &a, T v) {
        a.stream_ << v;
        return a;
   }
private:
   std::ostrinstream stream_;
};
Цитата
Написал нижеследующим образом и получаю всё равно такую же ошибку. Почему?
У меня проблем этого кода с компиляцией нет.
PM   Вверх
mes
Дата 5.3.2010, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Dims @  5.3.2010,  16:23 Найти цитируемый пост)

А почему мой последний не компилируется? Ведь я, вроде, написал что ему надо. 

причина имеет те же корни smile

Цитата(Dims @  5.3.2010,  16:23 Найти цитируемый пост)
А почему мой последний не компилируется? Ведь я, вроде, написал что ему надо. 

 smile 
может немножко помягче написать то же самое : http://codepad.org/yuAzPD23 ?

Добавлено через 59 секунд
Цитата(bsa @  5.3.2010,  16:43 Найти цитируемый пост)
И вообще, наследовать подобные классы не есть хорошо. лучше использовать агрегацию:

а bsa уже сказал оказывается smile

Добавлено через 2 минуты и 21 секунду
Цитата(bsa @  5.3.2010,  16:43 Найти цитируемый пост)
У меня проблем этого кода 

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


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


Эксперт
***


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

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



Цитата(bsa @  5.3.2010,  17:43 Найти цитируемый пост)
У меня проблем этого кода с компиляцией нет. 

Какого кода и на какой системе?

Цитата(mes @  5.3.2010,  17:49 Найти цитируемый пост)
причина имеет те же корни


Те же корни -- это какие?

Вот этих

Цитата(Lazin @  4.3.2010,  15:30 Найти цитируемый пост)
исключение должно иметь конструктор копирования и оператор присваивания 


корней больше нет.

Цитата(mes @  5.3.2010,  17:49 Найти цитируемый пост)
ожет немножко помягче написать то же самое

Цитата(bsa @  5.3.2010,  17:43 Найти цитируемый пост)
наследовать подобные классы не есть хорошо. лучше использовать агрегацию


Это понятно. Вопрос уже в теории: почему не компилируется код?

Добавлено через 5 минут и 42 секунды
Да, бред какой-то. На Виндах не компилируется, а на Линуксе компилируется.
PM MAIL   Вверх
mes
Дата 5.3.2010, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Dims @  5.3.2010,  17:15 Найти цитируемый пост)
Вопрос уже в теории: почему не компилируется код?

приведите сообщение об ошибке .. интуитивно полагаю, что проблема в 
Цитата(mes @  5.3.2010,  16:49 Найти цитируемый пост)
 раскрытии закрытого конструктора копии

а точнее в том, как это действие интерпретирует Ваш компилятор.

Цитата(Dims @  5.3.2010,  17:15 Найти цитируемый пост)
исключение должно иметь конструктор копирования и оператор присваивания 
корней больше нет.

А вы уверены что  Вы освободили эти корни smile, в общем для начала ошибку в студию.

Это сообщение отредактировал(а) mes - 5.3.2010, 18:44


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


Эксперт
***


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

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



Ниже сообщение. Возникает ДВЕ ошибки:

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_ostringstream2
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_ostringstream2

Код такой:

Код

// Test_ostringstream2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "stdafx.h"

#include <sstream>
#include <iostream>

using namespace std;

class A : public ostringstream {

public:
    int myMember;

    A() : ostringstream() {
    }

    A(const A& proto) : ostringstream() {
        (*this) << ((ostringstream *)(&proto))->str();
    }

    A& operator=(const A& proto) {
        str("");
        (*this) << ((ostringstream *)(&proto))->str();
        return *this;
    }

};


int main() {
    A a;
    cout << "Hello!" << endl;
    throw a;
}



Добавлено через 3 минуты и 20 секунд
О, чё на сайте говорит: http://codepad.org/8pIjcxuu
PM MAIL   Вверх
Lazin
Дата 5.3.2010, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ostringstream не предназначен для наследования
использовать в качестве исключений, нужно классы - наследники std::exception, иначе будет невозможно в одном catch обрабатывать любые исключения, а так-же, если в конструкторе копирования вашего исключения будет брошено другое исключение - будет вызвана ф-я terminate
у basic_ios, скорее всего закрытый конструктор копирования, что не удивительно, поэтому ваш код не компилируется
PM MAIL Skype GTalk   Вверх
Dims
Дата 5.3.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Lazin @  5.3.2010,  20:11 Найти цитируемый пост)
у basic_ios, скорее всего закрытый конструктор копирования, что не удивительно, поэтому ваш код не компилируется 

На Линуксе мой код компилируется:

Код

[dims@testbed cpptests]$ cat test03.cpp
#include <sstream>
#include <iostream>

using namespace std;

class A : public ostringstream {

public:
    int myMember;

    A() : ostringstream() {
    }

    A(const A& proto) : ostringstream() {
        (*this) << ((ostringstream *)(&proto))->str();
    }

    A& operator=(const A& proto) {
        str("");
        (*this) << ((ostringstream *)(&proto))->str();
        return *this;
    }

};


int main() {
    A a;
    cout << "Hello!" << endl;
    throw a;
}
[dims@testbed cpptests]$ g++ test03.cpp
[dims@testbed cpptests]$ ./a.out
Hello!
terminate called after throwing an instance of 'A'
Aborted
[dims@testbed cpptests]$


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


Эксперт
****


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

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



http://cplusplus.com/reference/iostream/ostringstream/
поищите там конструктор копирования smile 

Цитата(Dims @  5.3.2010,  20:32 Найти цитируемый пост)
На Линуксе мой код компилируется

там другая реализация STL, даже если компилируется, зачем вам использовать ostringstream вместо исключения?
PM MAIL Skype GTalk   Вверх
Dims
Дата 5.3.2010, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Более полная проверка на Линуксе:

Код

[dims@testbed cpptests]$ cat test03.cpp
#include <sstream>
#include <iostream>

using namespace std;

class A : public ostringstream {

public:
    int myMember;

    A() : ostringstream() {
    }

    A(const A& proto) : ostringstream() {
        (*this) << ((ostringstream *)(&proto))->str();
    }

    A& operator=(const A& proto) {
        str("");
        (*this) << ((ostringstream *)(&proto))->str();
        return *this;
    }

};


int main() {

    A a1;

    a1 << "text to a1";
    cout << "a1 = " << a1.str() << endl;

    A a2;

    a2 << "text to a2";
    cout << "a2 = " << a2.str() << endl;

    cout << "copying a2 to a1" << endl;
    a1 = a2;

    a1 << "addition to a1";
    a2 << "addition to a2";

    cout << "a1 = " << a1.str() << endl;
    cout << "a2 = " << a2.str() << endl;

    cout << "complex copying a2 to a1" << endl;
    a1 = A(a2);

    cout << "a1 = " << a1.str() << endl;
    cout << "a2 = " << a2.str() << endl;

    try {
        cout << "throwing a1" << endl;
        throw a1;
    }
    catch(A &b) {
        cout << "catched = " << b.str() << endl;
    }

    cout << "bye." << endl;
}

[dims@testbed cpptests]$ ./a.out
a1 = text to a1
a2 = text to a2
copying a2 to a1
a1 = text to a2addition to a1
a2 = text to a2addition to a2
complex copying a2 to a1
a1 = text to a2addition to a2
a2 = text to a2addition to a2
throwing a1
catched = text to a2addition to a2
bye.
[dims@testbed cpptests]$


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


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


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

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



Цитата(Dims @  5.3.2010,  19:04 Найти цитируемый пост)
Ниже сообщение. Возникает ДВЕ ошибки:

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

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

это  логичное следствие, о котором как раз и предполагалось.

Цитата(Lazin @  5.3.2010,  19:11 Найти цитируемый пост)
ostringstream не предназначен для наследования

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



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


Эксперт
***


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

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



Цитата(Lazin @  5.3.2010,  20:38 Найти цитируемый пост)
поищите там конструктор копирования smile 

Зато конструктор копирования есть в моём классе. Вы не заметили? smile

Цитата(Lazin @  5.3.2010,  20:38 Найти цитируемый пост)
там другая реализация STL

Там есть конструктор копирования в ostringstream?

Цитата(Lazin @  5.3.2010,  20:38 Найти цитируемый пост)
зачем вам использовать ostringstream вместо исключения?

Почему бы и нет? Я уже объяснял, я хочу таким способом составлять сообщения об ошибке. Это удобнее, чем складывать string-и, так как для operator<< больше определений.

Добавлено через 4 минуты и 17 секунд
Цитата(mes @  5.3.2010,  20:46 Найти цитируемый пост)
ну раз код вызывает такие ошибки, то вопрос к компилятору ..

Тогда об чём мы толкуем уже битый день? Есть на форуме компилятор, пусть ответит на мой вопрос? smile

Цитата(mes @  5.3.2010,  20:46 Найти цитируемый пост)
это  логичное следствие, о котором как раз и предполагалось.

Объясните. Что означает это сообщение с codepad, как его понимать?

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


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


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

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



Цитата(Dims @  5.3.2010,  19:51 Найти цитируемый пост)
Тогда об чём мы толкуем уже битый день? Есть на форуме компилятор, пусть ответит на мой вопрос? smile

мы толкуем о том, что так делать не "красиво" , а Вы о том что Вам надо, к сожалению не заметив предложенный Вам вариант удовлетворяющий как Вашим , так и компиляторным требованиям  smile
Цитата(Dims @  5.3.2010,  19:51 Найти цитируемый пост)
Есть на форуме компилятор, пусть ответит на мой вопрос? smile

Т.е. Вы хотите писать компиляторо-зависимый код  ? a может лучше написать по правилам

Цитата(Dims @  5.3.2010,  19:51 Найти цитируемый пост)
Зато конструктор копирования есть в моём классе. Вы не заметили? smile

и не только мы, а также и компилятор smile и показывает Вам, что Вы поступаете не совсем правильно.

Цитата(Dims @  5.3.2010,  19:51 Найти цитируемый пост)
Объясните. Что означает это сообщение с codepad, как его понимать?

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

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


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


Эксперт
***


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

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



Цитата(mes @  5.3.2010,  22:02 Найти цитируемый пост)
a может лучше написать по правилам

По каким? Понимаете, дуть на воду я и сам умею. Назовите правило, которое я нарушил в своём примере.

Цитата(mes @  5.3.2010,  22:02 Найти цитируемый пост)
и не только мы, а также и компилятор smile и показывает Вам, что Вы поступаете не совсем правильно.

В чём же ошибка? Конструктор копирования у меня есть, присваивание у меня есть. Имею право throw-ить. 

Цитата(mes @  5.3.2010,  22:02 Найти цитируемый пост)
оно говорит о том, что хотя у Вашего наследника и открытый конструктор копий, но действие не совсем законно, так как предок желал быть не копированным так как его конструктор копий закрыт. Т.е. другими словами компилятор ловит Вас на "жульничестве" 

Не могу согласиться. Язык не требует у меня, чтобы я в копирующем конструкторе наследника вызывал именно копирующий конструктор предка (а не какой-либо другой). Следовательно, если логика моей задачи позволяет в копирующем конструкторе инициализировать базовый класс по-другому, я могу это сделать и никакого жульничества тут нет.
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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