Форум программистов, компьютерный форум 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, 11:30  [ТС]     Не хватает знаний. Не знаю, как на с++ реализовать возможность #61
Цитата Сообщение от Deviaphan Посмотреть сообщение
Более того, используя метод get, ты фактически лишаешься владения объектом, не лишаясь его. Ведь для полученного из Get указателя, ничто не мешает вызвать delete (ничто, кроме здравого смысла).
Ну нет. Я не для того так тщательно хотел упрятать подопечный объект, что бы потом первому встречному выдать голый указатель на него.

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

Добавлено через 45 секунд
Т.е. у тебя получается не универсальная замена указателя, но пригодный лишь для некоторых классов задач сильный указатель.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.11.2011, 11:37     Не хватает знаний. Не знаю, как на с++ реализовать возможность #63
Bers, Согласен с Deviaphan, например я использую бустовские указатели для работы с OpenSSL, написанной на сях. Всего лишь и нужно, что сконструировать shared_ptr с указателем и передать указатель на функцию удаления. При этом во всех функции OpenSSL передаю ptr.get() и все. Удобно. Освобождает от ответственности.
Bers
Заблокирован
16.11.2011, 11:43  [ТС]     Не хватает знаний. Не знаю, как на с++ реализовать возможность #64
Цитата Сообщение от Deviaphan Посмотреть сообщение
Например, у тебя уже есть функция, принимающая указатель на объект.
Если у меня есть функция, которая принимает указатель на объект - я скармливаю ей объект.
Если у меня есть функция, которая принимает сильный указатель, я скармливаю ей сильный указатель.

Если мне по замыслу нужно держать объект под защитой сильного указателя, но скармливать как обычный объект - значит в такой архитектуре есть какой то фейл.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 11:47     Не хватает знаний. Не знаю, как на с++ реализовать возможность #65
Т.е. ты не планируешь динамически создавать объекты, передаваемые, например, WinAPI функциям, которые и с С++ не очень дружат, а с твоим сильным указателем и подавно?
silent_1991
16.11.2011, 12:06
  #66

Не по теме:

Deviaphan, то, что было в нескольких сообщениях перед предупреждением (обсуждение удобства установки библиотек) - оффтоп.

Bers
Заблокирован
16.11.2011, 13:04  [ТС]     Не хватает знаний. Не знаю, как на с++ реализовать возможность #67
Цитата Сообщение от Deviaphan Посмотреть сообщение
Т.е. ты не планируешь динамически создавать объекты, передаваемые, например, WinAPI функциям, которые и с С++ не очень дружат, а с твоим сильным указателем и подавно?
Я с такими вещами не сталкивался.

Я вообще хочу уходить от явной работы с динамической памятью.
Вместо этого юзать пулы объектов и специализированные указатели.
Что касается интеграции с другими библиотеками всякими - ну когда будут рабочие нюансы, тогда и буду думать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2011, 13:16     Не хватает знаний. Не знаю, как на с++ реализовать возможность
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 13:16     Не хватает знаний. Не знаю, как на с++ реализовать возможность #68
Лучше подумай заранее. Потом исправлять будет сложнее.
Yandex
Объявления
16.11.2011, 13:16     Не хватает знаний. Не знаю, как на с++ реализовать возможность
Ответ Создать тему
Опции темы

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