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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
Bers
Заблокирован
#1

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

15.11.2011, 10:31. Просмотров 2510. Ответов 67
Метки нет (Все метки)

Есть одна вещь, которую у меня сделать никак не получается.

В моей старенькой 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 ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 10:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не хватает знаний. Не знаю, как на с++ реализовать возможность (C++):

Реализовать двусвязный список. В разных узлах одного списка может быть любой объект одного из допустимых типов (своих знаний не хватает) - C++
Вобщем делаю тестовые задания. На одно мне даже ответили, результат отрицательный. Помогите понять если кто поймёт его не так как я или...

Не знаю как реализовать - C++
Итак, пользователь может ввести, а может и ничего не вводить, но програма выводит число через каждые sleep(500) как реализировать...

Возможность доработки ERP системы без соответствующих знаний - C++
Подскажите пожалуйста, заказывал у разработчика ERP систему для себя, но вышло так что человек просто пропал. А сейчас возникла острая...

Не знаю как реализовать.Само задание в изображении. Работа с файлами - C++
Помогите пожалуйста, хотя бы как сделать так, чтобы считались строчки, которые заканчиваются буквой с клавиатуры.

Не знаю как реализовать чтение из файла/запись в файл с особыми условиями - C++
Добрый день! У меня есть файл file.txt с таким содержанием: xxx /x qqq zzz /z aaa ccc /c

Игра в кости: реализовать мини-казино; реализовать возможность игры 2 человек между собой - C++
Уважаемые форумчане! Подскажите, пож-та, где можно посмотреть программу игры в кости, но не человека и компьютера, а двух человек...

67
Bers
Заблокирован
15.11.2011, 17:01  [ТС] #31
Цитата Сообщение от ForEveR Посмотреть сообщение
В теории да. Но он допускает такой момент.
Цитата Сообщение от ForEveR Посмотреть сообщение
А более опасны такие варианты. Но всякий бред предусмотреть невозможно.
Ну это да, это я согласен. Не во всех случаях он сможет обнулить входящий указатель.
Но с другой стороны.. это все таки лучше, чем совсем ничего.

Ну а так вообще, по логике - указатель константный. Он и не должен его обнулять. Он же константный!
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.11.2011, 19:54 #32
Не путай константный указатель и указатель на константу. Здесь - указатель на константу.

Добавлено через 2 часа 51 минуту
Вспомнил. То было цитирование не Майерса, а Стивена Дьюхерста. Книжку звать "С++. Священные знания". Забавная книжка.)
1
Bers
Заблокирован
15.11.2011, 20:04  [ТС] #33
C++
1
2
const int& value = 10;
const int* cptr2 = &value;
сколько не втыкал, так ничего криминального и не увидил
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.11.2011, 20:10 #34
А вот если cptr2 консткастоп привести к не константному указателю и попробовать изменить значение...

Добавлено через 3 минуты
Вообще странно. Я бы на месте программы упал с исключением по изменению памяти в блоке данных. Видимо, надо код смотреть. Или я не правильно понимаю, в какое место он константу 10 сохраняет.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2011, 20:26 #35
Deviaphan, Если переменную объявлять не как ссылку - то не изменит.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.11.2011, 20:42 #36
Цитата Сообщение от ForEveR Посмотреть сообщение
Если переменную объявлять не как ссылку - то не изменит.
Вот именно в этом варианте интересно. Т.е. по идее у "магического числа" и адреса быть не должно. Но раз есть, значит оно где-то записано. Получается, что не в секции данных, а как обычная переменная. Причём не помечена как константа, раз ошибки доступа нет. Я сейчас пробовал уронить, норм всё отработало. И вот теперь думаю, в каком месте я не прав и как оно на самом деле работает.)
0
Bers
Заблокирован
16.11.2011, 02:37  [ТС] #37
C++
1
2
3
4
5
const int& value = 10;
    const int* cptr2 = &value;
    TSharedPointer<int> p2(cptr2); //ассерт на попытку убить объект. В релизе молчком
    std::cout << value << std::endl;
    (*p2)=100; //Молча меняет значение константы value на 100
Получается, что есть лазейка, через которую можно засунуть в сильный указатель бомбу.

Кстати! А как стандартные (бустовские) указатели отреагируют, если им скормить константные исходные данные?


Мне почему то кажется, что с таким средством как конст_каст можно любой самый надежный класс довести до анархии.
Когда класс уже точно не знает, например... можно данный объект вообще убивать, или нельзя? Не удалил - утечка, удалил - взорвался.

Если была возможность запретить сильному указателю принимать на входе вот такую ересь
C++
1
2
 const int& value = 10;
    const int* cptr2 = &value;
И вообще, констатные указатели, и указатели на константу. Пусть работает с обычными константами..
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 06:12 #38
Цитата Сообщение от Bers Посмотреть сообщение
Кстати!
От обезьяны с гранатой никто не застрахован.
C++
1
2
int a;
std::shared_ptr<int> ptr(&a);
0
Bers
16.11.2011, 06:51  [ТС]
  #39

Не по теме:

Deviaphan, у меня отказалась студия апгредиться. Есть подозрение - из-за того что она русская.

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

Можно ли как нибудь её проапгрейдить в ручную? Ну допустим, тупо скопировав стандартную библиотеку?

А если можно, не знаете где можно отдельно от студии достать std ?
(стандартную библиотеку, а не пространство имён, если кто опять не понял)

0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 07:05 #40
Цитата Сообщение от Bers Посмотреть сообщение
Можно ли как нибудь её проапгрейдить в ручную? Ну допустим, тупо скопировав стандартную библиотеку?
Можно. Вся std это шаблонная библиотека, т.е. весь её код в хэдэрах.
Но тогда уж лучше сразу портабл ставь, заодно лицензионных прав майкрософта не нарушишь.)

На Английскую версию все сервис паки без вопросов ставились, так что скорее всего из-за Русского, да.

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Конкретно мне хочется разжиться стандартизированными указателями.
Используй буст.) Он "стандартнее", чем студия. И совместимость не потеряешь.
0
Bers
Заблокирован
16.11.2011, 07:11  [ТС] #41
Цитата Сообщение от Deviaphan Посмотреть сообщение
Можно. Вся std это шаблонная библиотека, т.е. весь её код в хэдэрах.
А где её взять то можно?
Поставить какую нибудь свежую студию, и оттуда просто скопировать все файлы std ?

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


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

Не по теме:

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

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

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

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

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

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

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

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

Не по теме:

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

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

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

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

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2011, 08:17
Привет! Вот еще темы с ответами:

Числа считаются равными если они отличаются не более, чем на (10^-12) / c++ / как реализовать эту возможность? - C++
На плоскости заданы три точки А, В и С. Определить, какая из двух последних точек (B или C) расположена ближе к A, и вывести расстояние от...

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

Не хватает знаний. Выбор между ноутом и стационар - Офисный компьютер
Здравствуйте, друзья. В общем хочу себе купить компьютер. Бюджет около 420 у.е. (плюс минус - но лучше минус 8-)) Собственно выбор...

Не знаю как реализовать - PHP
Требуется сделать поиск без перезагрузки страницы, то есть: Вбиваешь в поиск и сразу результаты, меняешь страницу (LIMIT 0,10) и к 0...


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

Или воспользуйтесь поиском по форуму:
45
16.11.2011, 08:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru