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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация объекта pair<T,T> без конструктора T 
V
    Опции темы
Dims
Дата 7.12.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Хочу создать пару из объектов, в классах которых нет конструктора по умолчанию, так что строка

Код

pair<CSpecSizeModel,CSpecSizeModel> ans;


вызывает ошибку no appropriate default constructor available где-то в глубинах STL

Это логично. Поэтому я пишу

Код

pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));


поскольку конструктор CSpecSizeModel принимает 1 целочисленный параметр.

Но и это вызывает ошибку error C2086: 'CSpecSizeModel i' : redefinition

Почему?


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


Эксперт
****


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

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



Попробуй воспользоваться ф-й 
Код

std::make_pair( CSpecSizeModel(i), CSpecSizeModel(i) );


Добавлено через 1 минуту и 5 секунд
возможно компилятор принимает 
Цитата(Dims @  7.12.2007,  10:20 Найти цитируемый пост)
pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));

за объявлени функции, хотя я не уверен в этом....
PM MAIL Skype GTalk   Вверх
Dims
Дата 7.12.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



1) Сперва я сделал тайпдеф:

Код

typedef pair<CSpecSizeModel,CSpecSizeModel> CPairOfSpecSizeModels;


не помогло.

2) Потом я записал вот так

Код

CPairOfSpecSizeModels ans = CPairOfSpecSizeModels(CSpecSizeModel(i),CSpecSizeModel(i));


и тогда стало компилироваться.
PM MAIL   Вверх
UnrealMan
Дата 7.12.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lazin @ 7.12.2007,  10:40)
возможно компилятор принимает 
Цитата(Dims @  7.12.2007,  10:20 Найти цитируемый пост)
pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));

за объявлени функции

Это действительно объявление функции.

Добавлено через 2 минуты и 36 секунд
Если конструктор CSpecSizeModel для i не является explicit, то достаточно будет записать так:

Код

std::pair<CSpecSizeModel, CSpecSizeModel> ans(i, i);

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


Эксперт
***


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

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



а можно полюбопытствовать в роли чего в
Код
pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));

выступает i ?


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 7.12.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В роли имени параметра функции smile
PM MAIL   Вверх
Alek86
Дата 7.12.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а тип где?

Добавлено через 26 секунд
или я чето не догоняю....

просьба сжалиться и объяснить чуть подробнее smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 7.12.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В стандарте написано, все что может быть объявлением, должно быть объявлением. поэтому код:
pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));
компилятор видит, как:
type1 ans(type2 (i), type2(i));
Из которого убираются лишние скобки:
type1 ans(type2 i, type2 i);
и лишние имена переменных:
type1 ans(type2, type2);
А это уже объявление функции.
PM   Вверх
bsa
Дата 7.12.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Сильно меня перехваливать не стоит. Я позаимствовал этот способ демонстрации из книги: "Герб Саттер - Новые сложные задачи на C++"
PM   Вверх
JackYF
Дата 7.12.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Кажись, никто не осветил собственно решение этой коллизии, вот оно (взято, естественно, всё оттуда же):
Код

pair<CSpecSizeModel,CSpecSizeModel> ans((CSpecSizeModel(i)),(CSpecSizeModel(i)));



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 7.12.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Слишком много скобок. Проще C-каст сделать.
PM MAIL   Вверх
JackYF
Дата 7.12.2007, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(UnrealMan @  7.12.2007,  22:38 Найти цитируемый пост)
Проще C-каст сделать. 

Нет уж, хватит с меня С-кастов...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
baldina
Дата 8.12.2007, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Слишком много скобок. Проще C-каст сделать. 


а чем
std::pair <X,X> p = std::make_pair(X(i), X(i));
не подходит?

Это сообщение отредактировал(а) baldina - 8.12.2007, 03:24
PM MAIL   Вверх
UnrealMan
Дата 8.12.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(baldina @  8.12.2007,  03:15 Найти цитируемый пост)
а чем
std::pair <X,X> p = std::make_pair(X(i), X(i));
не подходит?

Много буков smile

Добавлено @ 11:36
Цитата(JackYF @  7.12.2007,  23:50 Найти цитируемый пост)
Нет уж, хватит с меня С-кастов... 

А чем функциональное преобразование лучше?

Это сообщение отредактировал(а) UnrealMan - 8.12.2007, 11:37
PM MAIL   Вверх
JackYF
Дата 8.12.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(UnrealMan @  8.12.2007,  11:34 Найти цитируемый пост)
А чем функциональное преобразование лучше?

тем, что оно ограничивает область преобразования. Тем, что я знаю, делает ли компилятор физические преобразования (static_cast), логические (reinterpret_cast), вниз по иерархии классов (dynamic_cast), или же опасную отмену константности (const_cast).

Разделение обязанностей. Разделяй и властвуй.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 8.12.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



ДжэкИФ, в случае сложного типа ты не сможешь отменить константность и сделать прочие опасные преобразования smile.
В принципе, кастить c-cast'ом противопоказанно в шаблонном коде, когда ты не знаешь, что из себя представляет T. В других же случаях можно, но я не рекомендую - плохой стиль, плохая привычка smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 8.12.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JackYF @  8.12.2007,  14:06 Найти цитируемый пост)
тем, что оно ограничивает область преобразования

Это как же? Функциональный каст делает абсолютно те же преобразования, что и C-каст, просто синтаксис другой.

Цитата(JackYF @  8.12.2007,  14:06 Найти цитируемый пост)
Тем, что я знаю, делает ли компилятор физические преобразования (static_cast), логические (reinterpret_cast), вниз по иерархии классов (dynamic_cast), или же опасную отмену константности (const_cast).

Ну, тогда тебе надо было записать

Код

pair<CSpecSizeModel,CSpecSizeModel> ans(static_cast<CSpecSizeModel>(i), static_cast<CSpecSizeModel>(i));

Так сказать, вариант специально для слепых smile
PM MAIL   Вверх
archimed7592
Дата 8.12.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(UnrealMan @  8.12.2007,  18:14 Найти цитируемый пост)
Это как же? Функциональный каст делает абсолютно те же преобразования, что и C-каст, просто синтаксис другой.

Что и так можно?
Код

const int *cp = ...;
int *p(cp);



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 8.12.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(archimed7592 @ 8.12.2007,  18:16)
Цитата(UnrealMan @  8.12.2007,  18:14 Найти цитируемый пост)
Это как же? Функциональный каст делает абсолютно те же преобразования, что и C-каст, просто синтаксис другой.

Что и так можно?
Код

const int *cp = ...;
int *p(cp);

А где ты тут видишь функциональный каст? smile

Вот так

Код

const int *cp = 0;
typedef int *PInt;
int *p = PInt(cp);

можно.
PM MAIL   Вверх
archimed7592
Дата 9.12.2007, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(UnrealMan @  8.12.2007,  19:09 Найти цитируемый пост)
можно.

Сранно, сранно...

Добавлено через 29 секунд
Ой, извините, дважды букву "т" пропустил smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 9.12.2007, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JackYF @  9.12.2007,  01:44 Найти цитируемый пост)
После того, что я увидел, как работает С-каст в в случае приведения вниз по иерархии

Точно так же отработает и функциональное преобразование, которое ты выше использовал, ибо в случае одного аргумента это почти то же самое, что C-каст.

Добавлено через 53 секунды
Цитата(archimed7592 @  9.12.2007,  01:36 Найти цитируемый пост)
Сранно, сранно...

А чего странного-то?
PM MAIL   Вверх
archimed7592
Дата 9.12.2007, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(UnrealMan @  9.12.2007,  01:50 Найти цитируемый пост)
А чего странного-то? 

А ты букву "т" убери smile.

Добавлено через 44 секунды
JackYF, а можно пример, где получится мусор при приведении вниз по иерархии?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(archimed7592 @  9.12.2007,  08:38 Найти цитируемый пост)
а можно пример, где получится мусор при приведении вниз по иерархии? 

пожалуйста:

Код

#include <iostream>

class A
{
 private: 
        int a1, a2;

 public:
        A() : a1(1), a2(2) {}
        void f()
        {
                std::cout << "I am A::f()!\n";
        }
        virtual ~A() {}
};

class B
{
 private:
        double b1, b2;

 public:
        B() : b1(1.1), b2(2.2) {}
        void g()
        {
                std::cout << "I am B::g()!\n";
        }
        virtual ~B() {}
};

class C: public A, public B
{
        float c1, c2; 
public:
        C(): c1(666.6), c2(777.7) {}
        void h()
        {
                std::cout << "Tada! I am C::h()!\n";
                std::cout << "c1=" << c1 << " c2=" << c2 << std::endl;
                std::cout << "\nYes, I am here yet\n";
        }
};

int main()
{
        A* pa = new A;
        C* pc = (C*)pa;
        pc->h();

        return 0;
}


В результате выводится значения совсем левых мест памяти, а не C::c1, C::c2, что логично следует данного кода.

Добавлено через 24 секунды
а dynamic_cast<> вернул бы 0.

Добавлено через 1 минуту и 32 секунды
Цитата(UnrealMan @  9.12.2007,  01:50 Найти цитируемый пост)
Точно так же отработает и функциональное преобразование

нет. Оно вернёт 0. И я могу это проверить. А при любой попытке обратиться, если я забуду (надо же) проверить программа упадёт в кору.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 9.12.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Так Джеки, я сразу подчеркнул, что я говорю про сложные типы. Про указатели и прочие примитивные типы речи не шло - с ними и так всё понятно: ТАБУ.
А вот со сложными типами никаких опасных преобразований сделать невозможно. Под сложными я понимаю все пользовательские типы, кроме перечислений.

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(archimed7592 @  9.12.2007,  11:33 Найти цитируемый пост)
Про указатели и прочие примитивные типы речи не шло - с ними и так всё понятно: ТАБУ

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 9.12.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(JackYF @  9.12.2007,  11:48 Найти цитируемый пост)
ну так приведение вниз по иерархии только над указателями и может применяться. 

Ну так в свете беседы о сложных объектах я и не понял о чём вообще речь smile.
Ладно, разобрались и хорошо smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 9.12.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JackYF @  9.12.2007,  11:13 Найти цитируемый пост)
нет. Оно вернёт 0. 

Какой ещё ноль?

Ты несколькими постами ранее написал такой код:

Цитата(JackYF @  7.12.2007,  21:34 Найти цитируемый пост)
Код
pair<CSpecSizeModel,CSpecSizeModel> ans((CSpecSizeModel(i)),(CSpecSizeModel(i)));

CSpecSizeModel(i) - это явное преобразование в функциональной нотации.
(CSpecSizeModel)i - это будет явное преобразование в cast-нотации.
Оба эти преобразования эквивалентны. Только в случае с cast-нотацией здесь не надо будет ничего обрамлять дополнительными скобками, чтобы компилятор не считал ans функцией, на что я и указал.

Цитата(JackYF @  9.12.2007,  11:48 Найти цитируемый пост)
ну так приведение вниз по иерархии только над указателями и может применяться.

Да шо вы говорите?

Вот это

Код
static_cast<Derived &>(base_lvalue)

видимо, неправильное преобразование?

Это сообщение отредактировал(а) UnrealMan - 9.12.2007, 14:03
PM MAIL   Вверх
JackYF
Дата 9.12.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(UnrealMan @  9.12.2007,  14:02 Найти цитируемый пост)
Какой ещё ноль?

dynamic_cast<...> в случае неправильного приведения вниз по иерархии по указателю вернёт NULL, по ссылке - std::bad_cast.
а C-каст и в том, и в том случае просто вернёт неправильные указатель/ссылку.

Цитата(UnrealMan @  9.12.2007,  14:02 Найти цитируемый пост)
Да шо вы говорите?

Хорошо. Ещё по ссылке.


Цитата(UnrealMan @  9.12.2007,  14:02 Найти цитируемый пост)
static_cast<Derived &>(base_lvalue)

Да, такой оператор неверен. Он не должен скомпилироваться.

Цитата(UnrealMan @  9.12.2007,  14:02 Найти цитируемый пост)
CSpecSizeModel(i) - это явное преобразование в функциональной нотации.

Это вообще-то в данном случае вызов конструктора.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 9.12.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JackYF @  9.12.2007,  15:22 Найти цитируемый пост)
Да, такой оператор неверен. Он не должен скомпилироваться.

Да шо вы говорите? smile

Цитата(5.2.9 Static cast)
An lvalue of type “cv1 B”, where B is a class type, can be cast to type “reference to cv2 D”, where D is a class derived (clause 10) from B, if a valid standard conversion from “pointer to D” to “pointer to B” exists (4.10), cv2 is the same cv-qualification as, or greater cv-qualification than, cv1, and B is not a virtual base class of D. The result is an lvalue of type “cv2 D.” If the lvalue of type “cv1 B” is actually a sub-object of an object of type D, the lvalue refers to the enclosing object of type D. Otherwise, the result of the cast is undefined. [Example:

Код
struct B {};
struct D : public B {};
D d;
B &br = d;
static_cast<D&>(br); // produces lvalue to the original d object

—end example]

Цитата(JackYF @  9.12.2007,  15:22 Найти цитируемый пост)
Это вообще-то в данном случае вызов конструктора. 

А вот что по этому поводу говорит стандарт:

Цитата(5.2.3 Explicit type conversion (functional notation))
A simple-type-specifier (7.1.5) followed by a parenthesized expression-list constructs a value of the specified type given the expression list. If the expression list is a single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4).

CSpecSizeModel(i) - это явное преобразование в функциональной нотации, выполняемое при помощи конструктора.

Это сообщение отредактировал(а) UnrealMan - 9.12.2007, 16:07
PM MAIL   Вверх
archimed7592
Дата 9.12.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



UnrealMan, а как тебе предложение в будущем попробовать излагать информацию не как насмешку, а как повествование? Мне кажется, что в том, что кто-то чего-то не знает или в чём-то заблуждается нет ничего смешного.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Dims
Дата 9.12.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Alek86 @ 7.12.2007,  16:24)
а можно полюбопытствовать в роли чего в
Код
pair<CSpecSizeModel,CSpecSizeModel> ans(CSpecSizeModel(i),CSpecSizeModel(i));

выступает i ?

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

Не так?

Добавлено через 1 минуту и 18 секунд
Цитата(UnrealMan @  7.12.2007,  16:17 Найти цитируемый пост)
Если конструктор CSpecSizeModel для i не является explicit

А что это значит?
PM MAIL   Вверх
archimed7592
Дата 9.12.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Dims @  9.12.2007,  16:11 Найти цитируемый пост)
Не так?

Не всегда.
Код

int i = 5;
int j = int(i); // переменная
int f(int(i)); // ф-ция, принимающая int, возвращающая int

Очень хорошо объяснил bsa - советую прочитать. А ещё лучше прочитать указанную им книгу.


Цитата(Dims @  9.12.2007,  16:11 Найти цитируемый пост)
А что это значит? 

Код

struct A
{
  A(int)
  { }
};

struct B
{
  explicit B(int)
  { }
};

struct C
{
  explicit C(B)
  { }
};

int main()
{
  A a = 5; // ok
  B b1 = 5; // error
  B b2(5); // ok;
  C c1 = b2; // error
  C c2(b2); // ok
  int i = 5;
  C c3(B(i)); // ok, но это будет объявлением ф-ции
  C c4 = c3(b2); // ok
}

C c3(B i)
{
  return C(i);
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 9.12.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(archimed7592 @  9.12.2007,  16:05 Найти цитируемый пост)
Мне кажется, что в том, что кто-то чего-то не знает или в чём-то заблуждается нет ничего смешного. 

Вопрос: если человек чего-то не знает, то почему считает возможным вступать в спор? Зачем так рьяно выдавать свои домыслы за действительность? Может, лучше сначала посмотреть в стандарт? Или хотя бы научиться добавлять к своим словам "IMHO"? Ведь народ сюда приходит не за бабушкиными сказками, не так ли? 

Цитата(archimed7592 @  9.12.2007,  16:05 Найти цитируемый пост)
UnrealMan, а как тебе предложение в будущем попробовать излагать информацию не как насмешку, а как повествование?

А ты сам-то часто следуешь своему предложению? ;)

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


Архимед
****


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

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



Цитата(UnrealMan @  9.12.2007,  16:24 Найти цитируемый пост)
Вопрос: если человек чего-то не знает, то почему считает возможным вступать в спор? Зачем так рьяно выдавать свои домыслы за действительность? Может, лучше сначала посмотреть в стандарт? Или хотя бы научиться добавлять к своим словам "IMHO"? Ведь народ сюда приходит не за бабушкиными сказками, не так ли? 

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


Цитата(UnrealMan @  9.12.2007,  16:24 Найти цитируемый пост)
А ты сам-то часто следуешь своему предложению? ;)

Нередко ;).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(UnrealMan @  9.12.2007,  15:58 Найти цитируемый пост)
Да шо вы говорите?

Что ни день, то открытия... Жаль...

Ладно.
Цитата(UnrealMan @  9.12.2007,  15:58 Найти цитируемый пост)
If the lvalue of type “cv1 B” is actually a sub-object of an object of type D, the lvalue refers to the enclosing object of type D. Otherwise, the result of the cast is undefined.

Будешь пользоваться таким приведением? Я - нет. UB'a мне только в коде не хватало. Но за инфу спасибо.

Цитата(UnrealMan @  9.12.2007,  15:58 Найти цитируемый пост)
выполняемое при помощи конструктора.

вот. главное, что никакого UB - чётко и ясно указано, с помощью какой функции будет произведено преобразование.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 9.12.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(archimed7592 @  9.12.2007,  16:35 Найти цитируемый пост)
Это уже проблемы конкретного человека.

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

Добавлено через 4 минуты и 42 секунды
Цитата(JackYF @  9.12.2007,  16:58 Найти цитируемый пост)
Будешь пользоваться таким приведением?

Буду, если оно точно сделает то, что я ожидаю.

Цитата(JackYF @  9.12.2007,  16:58 Найти цитируемый пост)
вот. главное, что никакого UB - чётко и ясно указано, с помощью какой функции будет произведено преобразование.

С помощью той же, что и для каст-нотации.
PM MAIL   Вверх
archimed7592
Дата 9.12.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(UnrealMan @  9.12.2007,  16:59 Найти цитируемый пост)
Когда таких конкретных людей много, это уже проблема форума, где на высказываемые мнения участников нельзя положиться. 


 ! 
archimed7592
Если тебя что-то не устраивает в форуме, то ты можешь обратиться в соответствующем разделе к администрации с конструктивными предложениями или просто жалобами.
Дальнейшее обсуждение здесь считаю недопустимым и расчитываю на твоё понимание.


Цитата
Буду, если оно точно сделает то, что я ожидаю.

Да ессно, это дело личных предпочтений. Некоторые считают, что лучше писать 0 == a, чем a == 0, тем самым минимизируя вероятность ошибки. Я таких ошибок не делаю уже года 4 и считаю излишним. О кастах сказать такого не могу - потому и не пользуюсь чем попало. Наверное у тебя огромный опыт, раз ты так легко и непринуждённо используешь их.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 9.12.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(archimed7592 @  9.12.2007,  17:09 Найти цитируемый пост)
Да ессно, это дело личных предпочтений.

downcast посредством dynamic_cast выполняется значительно медленее, чем посредством static_cast. Это несколько сказывается на предпочтениях...
PM MAIL   Вверх
archimed7592
Дата 9.12.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(UnrealMan @  9.12.2007,  17:23 Найти цитируемый пост)
Это несколько сказывается на предпочтениях... 

smile.

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 9.12.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(archimed7592 @  9.12.2007,  17:28 Найти цитируемый пост)
Да нет, когда делается static_cast ясно и понятно(с большой долей вероятности), что делающий осознаёт что делает(извиняюсь за масло масленное).

JackYF, насколько я понял, имел в виду сравнение dynamic_cast vs static_cast.
PM MAIL   Вверх
archimed7592
Дата 9.12.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



 smile.
specialized-cast vs c-cast.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(UnrealMan @  9.12.2007,  16:59 Найти цитируемый пост)
где на высказываемые мнения участников нельзя положиться.

Все могут ошибаться. Я был уверен, что static_cast<> не может делать приведения вниз по иерархии. Ошибся. Я и сейчас в недоумении, почему ему разрешено это делать, но со стандартом не поспоришь.

Цитата(UnrealMan @  9.12.2007,  16:59 Найти цитируемый пост)
Буду, если оно точно сделает то, что я ожидаю.

 smile Как можно точно сделать UB?..


Цитата(UnrealMan @  9.12.2007,  17:23 Найти цитируемый пост)
downcast посредством dynamic_cast выполняется значительно медленее, чем посредством static_

Знаешь, если в программе downcasting выполняется хоть сколько-либо значимое время, то, имхо, прогу давно пора переписывать.


Цитата(UnrealMan @  9.12.2007,  17:54 Найти цитируемый пост)
JackYF, насколько я понял, имел в виду сравнение dynamic_cast vs static_cast. 

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 9.12.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(JackYF @  9.12.2007,  19:39 Найти цитируемый пост)
Возможность того, что в результате преобразования я получу мусор

Такая возможность есть почти везде. Ты ловишь исключения от new? smile


Цитата(JackYF @  9.12.2007,  19:39 Найти цитируемый пост)
Знаешь, если в программе downcasting выполняется хоть сколько-либо значимое время, то, имхо, прогу давно пора переписывать.

Неа. Downcasting static_cast'ом - распространённая практика, а вот dynamic_cast'ом - ИМХО, нужно переписывать smile.
Вообще говоря, dynamic и const пользовался раза 2-3 в жизни. А reinterpret вообще не юзал.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(archimed7592 @  9.12.2007,  19:45 Найти цитируемый пост)
Ты ловишь исключения от new?

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

Цитата(archimed7592 @  9.12.2007,  19:45 Найти цитируемый пост)
Downcasting static_cast'ом - распространённая практика

К счастью, не сталкивался с таким.
Downcasting сам по себе в плюсах - вещь, использование которой желательно ограничивать...

Ты тоже будешь делать downcasting static_cast'ом?

P.S. Ребята, вы меня пугаете...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 9.12.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(JackYF @  9.12.2007,  20:13 Найти цитируемый пост)
Ты тоже будешь делать downcasting static_cast'ом?

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Ну что ж... каждому своё мнение smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Любитель
Дата 9.12.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(JackYF @  9.12.2007,  20:13 Найти цитируемый пост)
Downcasting сам по себе в плюсах - вещь, использование которой желательно ограничивать...

Почему? И главное - почему именно в плюсах? Я не спорю, что зачастую лучше от него отказаться, но каким-то правилом это делать не стоит smile

Цитата(archimed7592 @  9.12.2007,  19:45 Найти цитируемый пост)
Вообще говоря, dynamic и const пользовался раза 2-3 в жизни

Ну, всё же на мой взгляд динамик нужен достаточно часто. Конст и реинтерпрет - либо изврат, либо врапперы над чисто сишными библиотеками. Хотя, в некоторых случаях, если я уверен в кастинге, конечно, предпочту статик динамику - в силу перформанса. Хотя, если честно, чаще использую qobject_cast, чем динамик (это, конечно, не одно и то же, но динамик в чистом виде мне редко нужен)  smile 

Цитата(archimed7592 @  9.12.2007,  19:45 Найти цитируемый пост)
 а вот dynamic_cast'ом - ИМХО, нужно переписывать

Всмысле перписывать? На что? Или перепроектировать? smile

Цитата(UnrealMan @  9.12.2007,  17:54 Найти цитируемый пост)
сравнение dynamic_cast vs static_cast.

Ну, вообще, по-моему вначале речь шла про:
1. Равны ли c-cast b functional cast.
2. Нужны ли они.
smile



--------------------
PM MAIL ICQ Skype   Вверх
JackYF
Дата 10.12.2007, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Любитель @  9.12.2007,  22:04 Найти цитируемый пост)
что зачастую лучше от него отказаться

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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Random13
Дата 10.12.2007, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(archimed7592 @ 9.12.2007,  16:22)
Очень хорошо объяснил bsa - советую прочитать. А ещё лучше прочитать указанную им книгу.

Может вопрос не в тему, но раз упомянули - данную книгу нашел, нужно самообразовываться  smile . Но там написано, что - это вторая книга - продолжение книги  "Решение сложных задач C++" Эту книгу на русском что-то найти никак не могу. Может у кого есть ссылка. Нашел только на английском.
тут

Это сообщение отредактировал(а) Random13 - 10.12.2007, 01:34
PM MAIL   Вверх
Lazin
Дата 10.12.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(JackYF @  9.12.2007,  11:13 Найти цитируемый пост)
Цитата(archimed7592 @  9.12.2007,  08:38 Найти цитируемый пост)
а можно пример, где получится мусор при приведении вниз по иерархии? 

пожалуйста:

Цитата(JackYF @  9.12.2007,  11:13 Найти цитируемый пост)
Код

int main()
{
        A* pa = new A;
        C* pc = (C*)pa;
        pc->h();
        return 0;
}


Цитата(JackYF @  9.12.2007,  11:13 Найти цитируемый пост)
В результате выводится значения совсем левых мест памяти, а не C::c1, C::c2, что логично следует данного кода.

Что не пост-то откровение smile 
В твоем приведении типа выполняется приведение вверх по иерархии, а не вниз, а это делать можно только если ты точно знаешь тип объекта, который приводишь.
А вниз по иерархии(от производного к базовому) можно приводить в любом случае.
Код

class A {....};
class B {....};
class C : public A, public B {....};
// так что этот код абсолютно нормален
C* pc = new C;
A* pa = (A*)pc;
B* pb = (B*)pb;

Причем указатели pa и pb будут естественно указывать на разные области памяти
PM MAIL Skype GTalk   Вверх
UnrealMan
Дата 10.12.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JackYF @  9.12.2007,  19:39 Найти цитируемый пост)
Я и сейчас в недоумении, почему ему разрешено это делать

Я уже сказал - скорость выполнения.

Цитата(JackYF @  9.12.2007,  19:39 Найти цитируемый пост)
Как можно точно сделать UB?..

Есть много способов smile

Цитата(JackYF @  9.12.2007,  19:39 Найти цитируемый пост)
Знаешь, если в программе downcasting выполняется хоть сколько-либо значимое время, то, имхо, прогу давно пора переписывать.

Это совсем не очевидное следствие.

Цитата(JackYF @  9.12.2007,  19:39 Найти цитируемый пост)
Возможность того, что в результате преобразования я получу мусор, сводит на нет все теоретические скоростные показатели такого преобразования.

Вопрос: откуда исходит эта возможность? Хочешь, я тебе сейчас докажу, что передавать аргумент по ссылке в функцию push_back вектора неправильно?

Рассмотрим пример

Код

std::vector<int> vec;
...
if (vec.size())
    vec.push_back(vec.back());

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

Цитата(Любитель @  9.12.2007,  22:04 Найти цитируемый пост)
Конст и реинтерпрет - либо изврат, либо врапперы над чисто сишными библиотеками.

Опять 25. const_cast может применяться для избежания дублирования кода, reinterpret_cast - для преобразований
char * <--> unsigned char *. И это только примеры, которые сразу вспоминаются.

Цитата(Любитель @  9.12.2007,  22:04 Найти цитируемый пост)
Ну, вообще, по-моему вначале речь шла про:
1. Равны ли c-cast b functional cast.
2. Нужны ли они.

Разговор про dynamic_cast завёл не я, а JackYF. Зачем - это вы у него спросите smile

Цитата(Lazin @  10.12.2007,  09:24 Найти цитируемый пост)
В твоем приведении типа выполняется приведение вверх по иерархии, а не вниз, а это делать можно только если ты точно знаешь тип объекта, который приводишь.
А вниз по иерархии(от производного к базовому) можно приводить в любом случае.

У тебя какая-то нетрадиционная терминология. Обычно принято считать, что дерево классов растёт сверху вниз.


Это сообщение отредактировал(а) UnrealMan - 10.12.2007, 11:25
PM MAIL   Вверх
Lazin
Дата 10.12.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(UnrealMan @  10.12.2007,  11:18 Найти цитируемый пост)
У тебя какая-то нетрадиционная терминология. Обычно принято считать, что дерево классов растёт сверху вниз.

Надо-же я всегда себе деревья по другому представлял, для меня вниз по иерархии(downcasting) - это от производного к базовому, в этом случае противоречия нет...
А где вы встречали такую терминологию?
И кстати причем здесь dynamic_cast? Вот всегда так бывает, начинается все с одной темы, потом обсуждение заходит неизвестно куда))
PM MAIL Skype GTalk   Вверх
UnrealMan
Дата 10.12.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lazin @  10.12.2007,  12:02 Найти цитируемый пост)
для меня вниз по иерархии(downcasting) - это от производного к базовому

http://en.wikipedia.org/wiki/Downcasting

Цитата(Lazin @  10.12.2007,  12:02 Найти цитируемый пост)
А где вы встречали такую терминологию?

В литературе smile Какой конкретно не помню.


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


Шустрый
*


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

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



Цитата(Lazin @ 10.12.2007,  12:02)
А где вы встречали такую терминологию?

Я встречал в UML диаграммах.
Но по-моему в аппкастинге тоже могут быть проблемы в случае множественного наследования. Там как-то делается уже подзабыл, чтобы вместо общего 2 раза повторяющегося родителя стоял на него поинтер - тогда проблем не будет.

Это сообщение отредактировал(а) Random13 - 10.12.2007, 15:23
PM MAIL   Вверх
JackYF
Дата 10.12.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Lazin @  10.12.2007,  09:24 Найти цитируемый пост)
В твоем приведении типа выполняется приведение вверх по иерархии, а не вниз

наоборот. Вниз по иерархии - от базового к наследнику.

Цитата(UnrealMan @  10.12.2007,  11:18 Найти цитируемый пост)
Я уже сказал - скорость выполнения.

Я принял этот аргумент.

Цитата(UnrealMan @  10.12.2007,  11:18 Найти цитируемый пост)
Это совсем не очевидное следствие.

Хорошо. Добавляю "имхо". Для меня это почти очевидно.

Цитата(UnrealMan @  10.12.2007,  11:18 Найти цитируемый пост)
Разговор про dynamic_cast завёл не я, а JackYF. Зачем - это вы у него спросите

Как частный случай С-каст vs С++-каст.

Цитата(Lazin @  10.12.2007,  12:02 Найти цитируемый пост)
И кстати причем здесь dynamic_cast?

придётся тебе читать тему сначала  smile 



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 10.12.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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




M
archimed7592
Да, уж, от темы то мы "малость" отошли :).


Цитата(UnrealMan @  10.12.2007,  11:18 Найти цитируемый пост)
const_cast может применяться для избежания дублирования кода, reinterpret_cast - для преобразований

С конст-кастом не поспоришь, но, как у const_cast'а, так и у copy-paste есть как плюсы, так и минусы.
Ну а reinterpret - я понимаю, что я обманываю сам себя, но делаю я это посредством двойного статик-каста(где встретил такой способ точно не помню, но там как-то хитро объяснялось, что это гут smile).

Это сообщение отредактировал(а) archimed7592 - 10.12.2007, 17:41


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 10.12.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(archimed7592 @  10.12.2007,  17:41 Найти цитируемый пост)
но делаю я это посредством двойного статик-каста

А почему бы сразу 10 static_cast-ов не вставить? Любое преобразование указателя к указателю через reinterpret_cast можно заменить двумя преобразованиями static_cast

cv T1 * → cv void * → cv T2 *

но наглядности это коду не прибавит, как хитро ни объясняй.



Это сообщение отредактировал(а) UnrealMan - 10.12.2007, 19:30
PM MAIL   Вверх
zkv
Дата 10.12.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(archimed7592 @  10.12.2007,  17:41 Найти цитируемый пост)
где встретил такой способ точно не помню, но там как-то хитро объяснялось, что это гут

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


Архимед
****


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

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



zkv, точно smile. Спасибо, а я забыл про этот ресурс... как раз почитаю чего новенького есть.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 11.12.2007, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(zkv @ 10.12.2007,  21:47)
Цитата(archimed7592 @  10.12.2007,  17:41 Найти цитируемый пост)
где встретил такой способ точно не помню, но там как-то хитро объяснялось, что это гут

тут говорится

Цитата
Дело в том, что стандарт совершенно не гарантирует то, что указатели на разные типы данных имеют одинаковый размер и структуру. reinterpret_cast выполнит приведение что называется «в лоб», и при этом не будет никакой гарантии того, что при этом не произойдет потери данных и полученный указатель будет валиден. Используйте двойной static_cast вместо reinterpret_cast. Стандарт гарантирует, что указатель на void имеет достаточный размер, чтобы уместить указатель на любые данные.

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


Это сообщение отредактировал(а) UnrealMan - 11.12.2007, 03:03
PM MAIL   Вверх
Lazin
Дата 11.12.2007, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(UnrealMan @  11.12.2007,  02:56 Найти цитируемый пост)
Дело в том, что стандарт совершенно не гарантирует то, что указатели на разные типы данных имеют одинаковый размер и структуру

Объясните мне, как указатели могут иметь разный размер.
Для извращенцев есть такой вариант
Код

A * ptr1;
B* ptr2;
ptrdiff_t pval = ptr1;
ptr2 = (B*)pval;

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


Опытный
**


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

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



Цитата(Lazin @  11.12.2007,  08:51 Найти цитируемый пост)
Объясните мне, как указатели могут иметь разный размер.

Если иметь в виду указатели на объекты, то я не знаю таких платформ. И вряд ли когда-нибудь буду иметь с ними дело smile Даже если бы двойной static_cast был переносимее (а стандарт не даёт никаких поводов так считать), я бы всё равно предпочёл reinterpret_cast - потому что читабельность кода для меня важнее, чем достижение мифической переносимости реальной программы, которая по-любому будет писаться с учётом специфики платформы.

В случае преобразований char * <--> unsigned char * я всегда C-cast использую.


Это сообщение отредактировал(а) UnrealMan - 11.12.2007, 10:27
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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