Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 15.01.2019
Сообщений: 8
1

Свой простейший smartpointer

01.02.2019, 20:06. Показов 1033. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Возник вопрос - как вывести адрес у собственного умного указателя (без операции разыменования)?
В строке 22 перегружен оператор *. Что и каким образом нужно перегрузить, чтобы выводить сам адрес в строке 23 (в данном коде она не работает).
<< перегружать пробовал - заморочно. Кажется, что есть способ проще.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
template<typename T>
class smartpointer
{
public:
    smartpointer(T* ptr)
    {
        this->ptr = ptr;
    }
    ~smartpointer()
    {
        delete ptr;
    }
    T& operator*() { return *ptr; }
private:
    T* ptr;
};
void foo()
{
    smartpointer<int> p = new int(87);
        cout << *p << endl; 
        cout << p << endl;
}
int main()
{
    setlocale(LC_ALL, "Rus");
    foo();
    return 0;
}
Попробовав перегрузить << получил 2 проблемы:
1.2 раза вызывается деструктор класса для одного и того же объекта
2.в принимаемых параметрах << не указать Т - теряется смысл в шаблонном классе
C++
1
2
3
4
5
ostream& operator<<(ostream& os, smartpointer<int> p)
{
    os << p.ptr;
    return os;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2019, 20:06
Ответы с готовыми решениями:

(конструктор) SmartPointer(Temp* p = NULL)
#include &lt;iostream&gt; using namespace std; class Temp { int TEMP; public: //конструктор...

Как написать свой простейший архиватор
Можно ли сделать свой &quot;Архиватор&quot;? То есть запустил прогу, там кнопочка &quot;Выбрать файл&quot;, жмем на...

Реализовать пользовательский класс "Smartpointer"
Выходит мне нужно убирать один из деструкторов? Как правильно оформить что бы работали оба...

Как посадить свой домен на свой сайт, который на домашнем компе?
У меня статический ip. на картинке видно что сейчас в настройках, в качестве записи A указал...

4
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.02.2019, 20:09 2
C++
1
ostream& operator<<(ostream& os, smartpointer<int> const & p)//ссылку передавайте
1
0 / 0 / 0
Регистрация: 15.01.2019
Сообщений: 8
01.02.2019, 20:40  [ТС] 3
Работает, спасибо - до этого сам так и хотел сделать, но среда разработки(VS 17) ругается, пишет что член недоступен, однако все компилируется.
А можно как-нибудь решить проблему с шаблоном при перегрузке <<? А то не хочется для всех используемых типов данных перегружать.

Добавлено через 12 минут
Перегруженный в классе << работать не хочет (я не уверен, что правильно перегрузил):
C++
1
2
3
4
5
ostream& operator<<(ostream& os)
    {
        os << this->ptr;
        return os;
    }
А вне класса спецификатор шаблона T компилятор не видит (оператор объявлен как friend):
C++
1
ostream& operator<<(ostream& os, smartpointer<T> const & p)
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
01.02.2019, 20:52 4
Лучший ответ Сообщение было отмечено Maksim21 как решение

Решение

Maksim21, можете сделать так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
template <typename T>
class smartpointer;
 
template <typename T>
std::ostream & operator<<(std::ostream &, smartpointer<T> const &);
    
template <typename T>
class smartpointer
{
public:
    smartpointer(T* ptr) : ptr(ptr)
    { }
    ~smartpointer()
    {
        delete ptr;
    }
    T & operator*() { return *ptr; }
    T const & operator*() const { return *ptr; }
    
    friend std::ostream & operator<< <>(std::ostream & out, smartpointer<T> const & x);    
    
private:
    T* ptr;
};
 
template <typename T>
std::ostream & operator<<(std::ostream & out, smartpointer<T> const & x)
{
    return out << *x.ptr;
}

Или так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename T>
class smartpointer
{
public:
    smartpointer(T* ptr) : ptr(ptr)
    { }
    ~smartpointer()
    {
        delete ptr;
    }
    T & operator*() { return *ptr; }
    T const & operator*() const { return *ptr; }
    
    friend std::ostream & operator<<(std::ostream & out, smartpointer const & x)
    {
        return out << *x.ptr;
    }
   
private:
    T* ptr;
};

Также, в первом варианте можно обойтись вообще без friend и сделать так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <typename T>
class smartpointer
{
public:
    smartpointer(T* ptr) : ptr(ptr)
    { }
    ~smartpointer()
    {
        delete ptr;
    }
    T & operator*() { return *ptr; }
    T const & operator*() const { return *ptr; }
 
private:
    T* ptr;
};
 
template <typename T>
std::ostream & operator<<(std::ostream & out, smartpointer<T> const & x)
{
    return out << *x;
}
1
0 / 0 / 0
Регистрация: 15.01.2019
Сообщений: 8
02.02.2019, 12:35  [ТС] 5
Нашел еще такое решение - перегрузил оператор приведения типа (сейчас узнал, что так можно):
C++
1
2
3
4
operator T* ()
    {
        return ptr;
    }
0
02.02.2019, 12:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2019, 12:35
Помогаю со студенческими работами здесь

Как установить свой текст подсказки при наведении на свой контрол?
Как установить свой текст подсказки при наведении на свой контрол?

Свой компонент от ListBox. Не могу задать свой тип для Items
День добрый господа. Нуждаюсь в вашей помощи. Суть такова, что я желаю создать свой компонент на...

В свой div свой текст, класс один и тот же
div class=&quot;head&quot;&gt;ОДИН&lt;/div&gt; &lt;div class=&quot;body&quot;&gt;&lt;div class=&quot;cl&quot;&gt;&lt;/div&gt; ...

Как сделать чтобы у каждой строки был свой список. Например, есть маршрутка, у каждой из нее есть свой список
Как сделать чтобы у каждой строки был свой список. Например, есть маршрутка, у каждой из нее есть...

Простейший калькулятор
Всем привет :) Это одна из самых первых моим программ в C++. Решил попробовать простейший...

Простейший JS скрипт
Привет, мир! Подскажите где допущена ошибка? &lt;!doctype html&gt; &lt;html&gt; &lt;head&gt; &lt;script...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru