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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование умных указателей 
V
    Опции темы
azesmcar
Дата 3.6.2011, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



boostcoder

а где тут приведение указателя на базовый тип к указателю на потомка?
PM   Вверх
boostcoder
Дата 3.6.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



azesmcar, та нет. я хотел показать что без каста такое невозможно.
PM WWW   Вверх
azesmcar
Дата 3.6.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(cupper @  2.6.2011,  21:28 Найти цитируемый пост)
И кстати, указатели это зло, зловещее зло 

 smile  smile 
как страшно жить smile

Добавлено через 31 секунду
Цитата(boostcoder @  3.6.2011,  14:36 Найти цитируемый пост)
azesmcar, та нет. я хотел показать что без каста такое невозможно. 

так ведь речь шла про downcast, а не про upcast smile 
PM   Вверх
boostcoder
Дата 3.6.2011, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(azesmcar @  3.6.2011,  14:36 Найти цитируемый пост)
так ведь речь шла про downcast, а не про upcast

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

Добавлено через 3 минуты и 44 секунды
Цитата(azesmcar @  3.6.2011,  14:33 Найти цитируемый пост)
а где тут приведение указателя на базовый тип к указателю на потомка? 

речь об этом?:
Код

struct base {};
struct derived: base {};

int main() {
   base* b = new derived;
   derived* d = b;
}

http://liveworkspace.org/code/15f2508fa76c...b707a3e1dda6f12

а что тут незаконного? или я что-то упустил?
PM WWW   Вверх
mes
Дата 3.6.2011, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  3.6.2011,  13:40 Найти цитируемый пост)
меня зантересовало утверждение о зле кастов, и о том, что касты свидетельство ошибки проектирования

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

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

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



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


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(boostcoder @  3.6.2011,  14:40 Найти цитируемый пост)
а что тут незаконного? 

http://codepad.org/C9s9zRmk
PM   Вверх
boostcoder
Дата 3.6.2011, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(mes @  3.6.2011,  15:01 Найти цитируемый пост)
каст действительно во многих случаях является ошибкой программирования, 
но в основном в тех, когда (по неопытности) программист предпочитает каст, взамен более удобному и безопасному инструменту для той задачи..
но.. каст нужная вещь, и очень часто примененная  с умом с позволяет добиться нужного поведения наиболее коротким способом.. 

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

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

Добавлено через 6 минут и 19 секунд
Цитата(azesmcar @  3.6.2011,  15:03 Найти цитируемый пост)
http://codepad.org/C9s9zRmk 

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

#include <iostream>

struct base { virtual void method() = 0; };
struct derived: base {
   virtual void method() {
      std::cout << "derived::method()" << std::endl;
   }
};

int main() {
   base* b = new derived;
   derived* d = b;
   
   b->method();
   d->method();
}

http://liveworkspace.org/code/aaeea40f6406...fc4d55be44c2c25

зы
на практике никогда такого не делал. честное слово.
PM WWW   Вверх
azesmcar
Дата 3.6.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(boostcoder @  3.6.2011,  15:05 Найти цитируемый пост)
с таким же успехом можно сказать и о наследовании. и о программировании в целом.

Нет, почему же.
Необходимость делать downcast должна настораживать программиста, а например необходимость использования оператора if - нет, впрочем как и использование наследования.

Цитата(boostcoder @  3.6.2011,  15:05 Найти цитируемый пост)
и естественно, предполагается, что прогер наделен моцгом. иначе не каст станет серьезной ошибкой, а сам факт существования такого прогера smile

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

Цитата(boostcoder @  3.6.2011,  15:05 Найти цитируемый пост)
ладно, компилятор недоволен. но на практике это к чему привести может в том случае, что подобный каст используется только в приведенном примере?:

Где тут cast? Я вообще понятия не имею как этот пример компилируется (если компилируется) и как компилятор должен повести себя в такой ситуации.
Код

#include <iostream>

struct base { virtual void method(); };
struct derived: base {
   virtual void method() {
      std::cout << "derived::method()" << std::endl;
   }
};

int main() {
   base* b = new base; // <----
   derived* d = b;
   
   b->method();
   d->method();
}

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


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


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

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



Цитата(boostcoder @  3.6.2011,  14:05 Найти цитируемый пост)
с таким же успехом можно сказать и о наследовании. и о программировании в целом.

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

Добавлено через 4 минуты и 52 секунды
вот взять к примеру crtp, хотя и используется каст, но он завязан на наследовании и поэтому возможность ошибки мала, так как компилятор в состоянии проверить легальность всей конструкции.. 




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


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


Опытный
**


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

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



когда я писал пост http://forum.vingrad.ru/index.php?showtopi...t&p=2356159

этот же online компилятор выдавал мне приведенный error. Сейчас он компилирует код. О_о
Код

#include <iostream>
#include <string>

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

class B : public A {
 public: B(){}
 std::string s;
};

class C : public A{
public:
 C(){}
 int a; 
};

int main()
{
   A* a = new B();
   
   B* b;
   C* c;
   
   b = a;
   c = a;
   
   b->s = "O_o";
   c->a = 10;
}

http://liveworkspace.org/code/a449910606cf...37cf3deb0d590f6

Девид Блейн, отдыхает.


Это сообщение отредактировал(а) cupper - 3.6.2011, 18:11
PM MAIL   Вверх
boostcoder
Дата 3.6.2011, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(cupper @  3.6.2011,  17:44 Найти цитируемый пост)
class base {};
class derived: base {};

значит, все же, struct отличается от class в с++

Добавлено через 7 минут и 30 секунд
Код

#include <iostream>

class base {
public:
   virtual void method() = 0;
};
class derived: public base {
public:
   virtual void method() {
      std::cout << "derived::method()" << std::endl;
   }
};

int main() {
   base* b = new derived;
   derived* d = b;
   
   b->method();
   d->method();
}

http://liveworkspace.org/code/8f1f86dea05b...807f74b33a42c98

все таки разницы никакой smile 
PM WWW   Вверх
boostcoder
Дата 3.6.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(cupper @  3.6.2011,  17:44 Найти цитируемый пост)
когда я писал пост http://forum.vingrad.ru/index.php?showtopi...t&p=2356159

этот же online компилятор выдавал мне приведенный error. Сейчас он компилирует код. О_о

это моя вина. я кое-что проверял вчера днем, и добавил в опции "-fpermissive". исправил. сорри smile 
теперь нужно все тесты проверять заново..

Добавлено @ 18:29
мля.. нехорошо получилось..

Это сообщение отредактировал(а) boostcoder - 3.6.2011, 18:29
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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