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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Цикл с параметром http://www.cyberforum.ru/cpp-beginners/thread384243.html
Ребят,помогите перевести программу на С++: Даны два целый числа А и В (А<B).Найти сумму всех целых чисел от А до В включительно. var A,B:integer; temp:integer; i:integer; begin temp:=0;
C++ посследовательности вводим число пока оно не равно 0. и складываем только положительные четные числа, выводим сумму. с циспользования цикла do {} while(); http://www.cyberforum.ru/cpp-beginners/thread384241.html
C++ Windows forms: обращение к одной форме из другой
Здравствуйте! Помогите пожалуйста: есть главная форма Form1 и форма с логином и паролем Login. Как обратиться из формы Login к элементу из формы Form1? Заранее спасибо.
C++ Определение и реализация класса.
Есть два кода: 1) Объявление класса #include <winioctl.h> #define FILE_DEVICE_WINIO 0x00008010 #define WINIO_IOCTL_INDEX 0x810 #define IOCTL_WINIO_ENABLEDIRECTIO CTL_CODE (...
C++ Единицы массы http://www.cyberforum.ru/cpp-beginners/thread384227.html
Ребята, помогите пожалуйста перевести программку с паскаля на С++: Единицы массы пронумерованы следующим образом: 1 — килограмм, 2 — миллиграмм, 3 — грамм, 4 — тонна, 5 — центнер. Дан...
C++ Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик 1)Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик.... подробнее

Показать сообщение отдельно
Bers
Заблокирован

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

15.11.2011, 10:31. Просмотров 2540. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.