Форум программистов, компьютерный форум CyberForum.ru

Не хватает знаний. Не знаю, как на с++ реализовать возможность - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
Bers
Заблокирован
15.11.2011, 10:31     Не хватает знаний. Не знаю, как на с++ реализовать возможность #1
Есть одна вещь, которую у меня сделать никак не получается.

В моей старенькой 2008 студии отсутствуют стандартизированные интеллектуальные указатели.
По этой причине я когда то написал собственные велосипеды для разных типов указателей.

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


C++
1
2
3
4
void Input(TypeT* &Object); //принять право владения объектом. 
                                //Источник - указатель,
                                // который в конце операции обнулится 
                                //(больше не будет владеть объектом)
Обратите внимание, что на входе ссылка на указатель, а не просто указатель.
Это нужно специально для того, что бы можно было обнулить аргумент.

Вот так выглядит реализация метода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void_TSharedPointer::Input(TypeT * &pObject)
{
    if(pObject==NULL_PTR) {   Release(); return;  }
 
    //следующее условие не корректно
    //Потому что , ситуация, 
    //когда аргумент указывает туда же,
    //куда и смартпоинтер возникнуть не может
    //Но покамест закроем на это глаза
 
    if(mp_Pointer != pObject)  
    {  
        Release();  
        mp_Pointer = pObject;
        mp_CounterLink=new int(1);
        pObject=NULL_PTR; 
    }
}
Обнуление аргумента гарантирует интеллектуальному указателю, что он действительно будит являться единственным владельцем объекта. И вызывающая сторона не сможет больше никак в обход его ничего сделать с ввереным ему объектом.

Все это здорово, и прекрасно.

Вот так это работает на практике:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
 
    int* ptr= new int;
 
    TSharedPointer<int> test(ptr);
    //теперь значение ptr равно NULL_PTR
    //объект принадлежит сильному указателю
    //а вызывающая сторона 
    //не имеет к нему прямого доступа
 
    EndProgramm();
}

Проблема в том, что я хочу сохранив инвариант сильного указателя, при этом иметь возможность написать вот так:
C++
1
2
3
4
5
6
7
int main()
{
    TSharedPointer<int> test(new int()  );  
    
  
    EndProgramm();
}
Компилятор мне на это пишет:

error C2664: TSharedPointer<TypeT>::TSharedPointer(TypeT *&): невозможно преобразовать параметр 1 из 'int *' в 'int *&'

Вопрос: как сохранить возможность обнуления входящих указателей, но при этом иметь возможность скармливать интеллектуальному указателю оператор new ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 10:31     Не хватает знаний. Не знаю, как на с++ реализовать возможность
Посмотрите здесь:

Реализовать двусвязный список. В разных узлах одного списка может быть любой объект одного из допустимых типов (своих знаний не хватает) C++
C++ Доработка программы: реализовать возможность работы с шестнадцатеричными числами
Возможность доработки ERP системы без соответствующих знаний C++
Не знаю как реализовать C++
Не знаю как реализовать чтение из файла/запись в файл с особыми условиями C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
16.11.2011, 07:11  [ТС]     Не хватает знаний. Не знаю, как на с++ реализовать возможность #41
Цитата Сообщение от Deviaphan Посмотреть сообщение
Можно. Вся std это шаблонная библиотека, т.е. весь её код в хэдэрах.
А где её взять то можно?
Поставить какую нибудь свежую студию, и оттуда просто скопировать все файлы std ?

Цитата Сообщение от Deviaphan Посмотреть сообщение
Используй буст.) Он "стандартнее", чем студия. И совместимость не потеряешь.
Он мне не подходит из религиозных убеждений.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 07:16     Не хватает знаний. Не знаю, как на с++ реализовать возможность #42
Цитата Сообщение от Bers Посмотреть сообщение
А где её взять то можно?
http://www.stlport.org/ и гугл никто не запрещал.)


Цитата Сообщение от Bers Посмотреть сообщение
Он мне не подходит из религиозных убеждений.
Меняй религию. Программист без знания буста никому не нужен.
Не использовать буст это то же самое, что не использовать std::sort и прочие алгоритмы по тем же религиозным соображениям.
Bers
16.11.2011, 07:40  [ТС]
  #43

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
http://www.stlport.org/ и гугл никто не запрещал.)
Я даже и не знал о том, что std распространяется отдельно от компиляторов.
Я думал что она распространяется так же примерно, как для студии - в виде паков.
Во вторых, мне же её внедрить в студию. Я даже не знаю как объяснить то... что бы студия мне потом не кричала, что она там чего то найти не может.

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

Цитата Сообщение от Deviaphan Посмотреть сообщение
Меняй религию. Программист без знания буста никому не нужен.
Не использовать буст это то же самое, что не использовать std::sort и прочие алгоритмы по тем же религиозным соображениям.
Вот не надо сравнивать стд и буст.
Я ничего не хочу говорить пред рассудительного в адрес самого буста, что бы избежать ненужного холивара.

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

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

В итоге, что бы его просто тупо установить под студией в Виндовс - это такие усилия пользователю затратить придётся. Что это за отношение к пользователю?
Вот пока создатели буста будут так наплевательски относится к пользователям, я не буду пользоваться их инструментами. Я буду пользоваться инструментами стд.

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 07:52     Не хватает знаний. Не знаю, как на с++ реализовать возможность #44
Цитата Сообщение от Bers Посмотреть сообщение
Я даже и не знал о том, что std распространяется отдельно от компиляторов
Это не стандартный std, а portable. Т.е. не привязанный ник майкрософту, ни к студии, ни к виндосу. Поэтому и отдельно.

Я не говорю о всём бусте. Я даже не знаю названий и назначения половины библиотек из него.
Однако, как минимум несколько библиотек просто необходимы абсолютно всем, практически всегда: различные виды интеллектуальных указателей и сериализация. Я просто не могу вспомнить ни одной программы. где бы мне хотя бы одной из бустовских библиотек не пришлось использовать. Конечно же, можно было и без них обойтись, но прописать путь я могу за 15 секунд, а вот реализовывать свою сериализацию придётся пару недель. Так что это вопрос хорошего тона и лени.
Bers
16.11.2011, 08:17  [ТС]
  #45

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
Так что это вопрос хорошего тона и лени.
У меня первая попытка поставить буст для студии совпала с первым чтением книги Александресску.

Ну так вот, понять о чем пишет Александресску было реально проще, чем понять, о чем написано в инструкции к "установке буста под виндовс". Там кучка каких то ключиков. Надо сначала из исходников собрать сам инсталятор. Потом уже с его помщью ещё кучка ключиков... ой...

И вот моя первая реакция: "а они что, они не могли сделать нормальный инсталятор под виндовс? Как у всех нормальныех тулзов, начиная от самой студии, и заканчивая всякими полезностями типа Черепашки?"

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

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

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 08:31     Не хватает знаний. Не знаю, как на с++ реализовать возможность #46
Цитата Сообщение от Bers Посмотреть сообщение
"а они что, они не могли сделать нормальный инсталятор под виндовс?
Не могли.) Ведь на студии и виндоусе свет клином не сошёлся.
Дистрибутив буста < 20 мегабайт. Собранная библиотека десяток гигабайт.
Можешь себе представить, сколько будут занимать версии для различных версий компиляторов... А так ты получаешь библиотеку оптимизированную именно под твой компилятор.
Да и собирать буст вовсе не обязательно. Многие библиотеки это просто шаблонные классы. В их числе и интеллектуальные указатели.

Например QT тоже самому собирать надо и это займёт в несколько раз больше времени, чем сборка буста.
Bers
16.11.2011, 08:44  [ТС]
  #47

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
Не могли.) Ведь на студии и виндоусе свет клином не сошёлся.
Дистрибутив буста < 20 мегабайт. Собранная библиотека десяток гигабайт.
Ну вот заходишь на сайт черепашки, там сразу на выбор: Под линукс, под виндовс, под ещё что нибудь. Тыкаешь - дальше все происходит автоматически.

Почему того же самого не сделали для буста?
Сделать несколько готовых дистрибутивов запиленных под конкретные ОС (или даже конкретные компиляторы) - это не что-то такое заоблачное.
20 мегабайт в наши дни не такая уж критичная цифра.

Пускай этот дистрибутив будит два часа шуршать и разворачивать все 10 гигабайт. Но при этом все что нужно будит сделать пользователю, это нажать на кнопочку "install"
А не прыгать рядом с полуфабрикатом с бубнами.

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

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 08:53     Не хватает знаний. Не знаю, как на с++ реализовать возможность #48
Цитата Сообщение от Bers Посмотреть сообщение
Пускай этот дистрибутив будит два часа шуршать и разворачивать все 10 гигабайт
20 мегабайт это исходники. Архив бинарников весит несколько гигабайт. Одни только либы статической компоновки для сериализации весят 500 мегабайт.

Цитата Сообщение от Bers Посмотреть сообщение
Видимо решили - умные ребята, как нибудь разберутся
Именно так и решили.) Документацию никто-же не отменял.)

Цитата Сообщение от Bers Посмотреть сообщение
А не прыгать рядом с полуфабрикатом с бубнами.
Программист ты или где? .)))

Кстати, loki тоже собирать нужно.
Bers
16.11.2011, 09:29  [ТС]
  #49

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
20 мегабайт это исходники. Архив бинарников весит несколько гигабайт. Одни только либы статической компоновки для сериализации весят 500 мегабайт.
Да ну это на самом деле не так уж важно. Пусть будит инсталятор, который сам соберёт дистрибутив, сам же его запустит, а дистрибутив уже сделает все остальное.
Ну получится конвеер сборки длиньше, а время сборки дольше.

Смысл в том, что сделать удобное средство сборки инструмента можно. Было бы желание.
И этих средств можно было бы наделать и для студии, и для чего угодно. И по сути, получились бы аналоги тех же паков, как это сделано в корпорации зла.

Цитата Сообщение от Deviaphan Посмотреть сообщение
Программист ты или где? .)))
Как грит один мой знакомый: "тебе дай волю, ты б все программирование бы свел к нажатию одной кнопачки".

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

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

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

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.11.2011, 09:44     Не хватает знаний. Не знаю, как на с++ реализовать возможность #50
Bers, Буст слишком универсальна для простого инсталятора. Откуда знать какие либы тебе нужны? Вот собираешь когда, тогда и указываешь.

На правах рекламы : в дистрах Linux-а уже лежит пакет для буста. Правда там отстают на пару версий, но это не столь важно.
Bers
16.11.2011, 09:49  [ТС]
  #51

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Буст слишком универсальна для простого инсталятора. Откуда знать какие либы тебе нужны?
откуда студия узнаёт какие тулзы нужны?

silent_1991
16.11.2011, 10:00
  #52
 Комментарий модератора 
Оффтоп заканчиваем.
Deviaphan
16.11.2011, 10:46
  #53

Не по теме:

Это не оффтоп, а логическое развитие вопроса ТС.
Ведь логичнее объяснить человеку, что у него ошибка в проектировании, а не просто указать на ошибку в коде и закрыть тему.
Молчу-молчу...

Bers
Заблокирован
16.11.2011, 10:52  [ТС]     Не хватает знаний. Не знаю, как на с++ реализовать возможность #54
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ведь логичнее объяснить человеку, что у него ошибка в проектировании,
Не вижу никакой ошибки в проектировании. Просто не удалось сделать 100% защиты инварианта сильного указателя. Но с другой стороны, те же бустовские указатели вообще даже и не пытаются такую защиту делать
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.11.2011, 10:53     Не хватает знаний. Не знаю, как на с++ реализовать возможность #55
Bers, Потому что это не нужно. Ошибка в проектировании - это про обнуление входящего указателя.
Bers
Заблокирован
16.11.2011, 10:55  [ТС]     Не хватает знаний. Не знаю, как на с++ реализовать возможность #56
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Потому что это не нужно. Ошибка в проектировании - это про обнуление входящего указателя.
Почему это не нужно?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.11.2011, 10:57     Не хватает знаний. Не знаю, как на с++ реализовать возможность #57
Bers, Уже объяснялось в теме.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 11:06     Не хватает знаний. Не знаю, как на с++ реализовать возможность #58
Цитата Сообщение от ForEveR Посмотреть сообщение
Ошибка в проектировании - это про обнуление входящего указателя.
И про создание класса интеллектуального указателя при уже существующий отлаженных и надёжных. Велосипед, использующийся годами множеством людей надёжнее, чем новая не обкатанная модель.
Bers
Заблокирован
16.11.2011, 11:08  [ТС]     Не хватает знаний. Не знаю, как на с++ реализовать возможность #59
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Уже объяснялось в теме.

Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Да потому что. Человек создал указатель. Подал его в smart_pointer. А потом захотел использовать так, без вызова get() и получил бабах. Не красиво.
Ну и плюс к тому бустовские смарты могут использоваться далеко не только с new.
Если человек скормил указатель смарту, все - смарт владец указателя.
что значит "а потом захотел так". А зачем потом хотеть так, если уже отдал владение объектом?

Я вот этого не понимаю. В идеале, вообще было бы здорова, если после того, как обычный указатель был скормлен смарту, любая попытка продолжать юзать обычный указатель немедленно вызывала бы крэш с поясняющей табличкой "Угроза! Подозрение на программную ошибку в вызывающем коде"

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Уже объяснялось в теме.
Цитата Сообщение от Deviaphan Посмотреть сообщение
И про создание класса интеллектуального указателя при уже существующий отлаженных и надёжных.
Буст идёт лесом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2011, 11:23     Не хватает знаний. Не знаю, как на с++ реализовать возможность
Еще ссылки по теме:

Числа считаются равными если они отличаются не более, чем на (10^-12) / c++ / как реализовать эту возможность? C++
C++ Не знаю как реализовать.Само задание в изображении. Работа с файлами

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 11:23     Не хватает знаний. Не знаю, как на с++ реализовать возможность #60
Цитата Сообщение от Bers Посмотреть сообщение
А зачем потом хотеть так, если уже отдал владение объектом?
Опять же уже упоминали, что можно продолжать использовать исходный указатель, вместо вызова smart::get(). При этом получаешь строгую гарантию, что при выходе из области видимости объект будет разрушен. Конечно, для этого лучше подходит scope_ptr, а не shared, но суть та же.

Хорошо, забудем про буст. В упомянутой тобой библиотеке loki (которую ты прям понял), тоже есть класс очень гибких интеллектуальных указателей. Причём с памятью они могут работать даже эффективнее, чем бустовские, благодаря SmallObjectAllocator.

Добавлено через 1 минуту
Более того, используя метод get, ты фактически лишаешься владения объектом, не лишаясь его. Ведь для полученного из Get указателя, ничто не мешает вызвать delete (ничто, кроме здравого смысла).
Yandex
Объявления
16.11.2011, 11:23     Не хватает знаний. Не знаю, как на с++ реализовать возможность
Ответ Создать тему
Опции темы

Текущее время: 14:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru