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

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

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

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

15.11.2011, 10:31. Просмотров 2434. Ответов 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 ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 10:31     Не хватает знаний. Не знаю, как на с++ реализовать возможность
Посмотрите здесь:

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

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

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

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

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

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

Взять программу со структурой Person и реализовать возможность использование - C++
помогите с задачей не пойму как делать Взять программу со структурой Person и реализовать возможность использование либо статические...

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

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

Добавлено через 45 секунд
Т.е. у тебя получается не универсальная замена указателя, но пригодный лишь для некоторых классов задач сильный указатель.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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++
1286 / 1220 / 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     Не хватает знаний. Не знаю, как на с++ реализовать возможность
Еще ссылки по теме:

Доработка программы: реализовать возможность работы с шестнадцатеричными числами - C++
здравствуйте! прошу помощи в доработке программы. нужно что бы она могла работать с шестнадцатеричными числами а не только с десятичными...

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

Не знаю как написать - C++
Помогите пожалуйста ! Задание : Дан символьный файл. Получить копию этого файла. совсем не пойму что делать... Есть ли какие либо...

Я не знаю как доработать - C++
Написал код, но очень криво и нифига ничего не работает. Наш препод ничерта не объясняет =( Учу С всего 2 месяца Итак задание:...

Не знаю как выполнить - C++
Помогите пожалуйста с этой задачей: Напишите функцию void compare (char str1, char str2), сравнивающую 2 символьных массива. Функция main...


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

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

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