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

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

Войти
Регистрация
Восстановить пароль
 
TonyM
1 / 1 / 0
Регистрация: 14.07.2011
Сообщений: 7
#1

Реализовал shared pointer class. В каких местах можно улучшить ? - C++

28.01.2012, 20:51. Просмотров 1038. Ответов 2
Метки нет (Все метки)

Изучаю с++, реализовал класс shared pointer(разумеется не в полной мере), хотелось бы услышать совета от людей более хорошо разбирающихся в с++, что можно было бы улучшить в имеющейся реализации.
Собственно код:
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "shared_ptr.h"
 
int main()
{
    {
        shared_ptr p1 = new Someclass();
        shared_ptr p2 = new Someclass();
 
        std::cout << p1->showA() << "\n";
        std::cout << (*p1).showA() << "\n";
 
        std::cout << p2->showA() << "\n";
        std::cout << (*p2).showA() << "\n";
    }
    system("pause");
    return 0;
}

shared_ptr.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef SHARED_PTR_H
#define SHARED_PTR_H
#include "storage.h"
class shared_ptr
{
    private:
        storage* ptr;
    public:
        shared_ptr (Someclass* pointer);
        ~shared_ptr ();
//      int getValue ();
        Someclass* operator-> ();
        Someclass& operator* ();
};
#endif

shared_ptr.cpp
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
#include "shared_ptr.h"
 
shared_ptr::shared_ptr(Someclass* pointer)
{
    std::cout << "going into scope. creating shared pointer...\n" ;
    this->ptr = new storage(pointer);
}
 
shared_ptr::~shared_ptr()
{
    std::cout << "going out of scope. deleting shared pointer...\n" ;
    delete this->ptr;
}
 
Someclass* shared_ptr::operator-> ()
{
    std::cout << "operator '->' in class shared_ptr used...\n" ;
    return this->ptr->getObjectByPointer();
}
 
Someclass& shared_ptr::operator* ()
{
    std::cout << "operator '*' in class shared_ptr used...\n" ;
    return this->ptr->getObjectByLink();
}

someclass.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef SOME_CLS_H
#define SOME_CLS_H
#include <iostream>
class Someclass
{
    private:
        int a;
    public:
        Someclass ();
        int showA ();
};
#endif

someclass.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "some_cls.h"
Someclass::Someclass ()
{
    this->a = 10;
}
 
int Someclass::showA ()
{
    return this->a;
}

storage.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef STORAGE_H
#define STORAGE_H
#include "some_cls.h"
class storage
{
    private:
        Someclass *p;
        static int counter;
    public:
        storage(Someclass *pointer);
        ~storage();
        int getLinkCount();
        bool isNull();
        Someclass* getObjectByPointer();
        Someclass& getObjectByLink();
};
#endif

storage.cpp
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "storage.h"
 
storage::storage(Someclass *pointer)
{
    if(this->isNull())
    {
        this->p = pointer;
    }
    ++storage::counter;
    std::cout << "Now we have "<< storage::counter << " links to Someclass\n";
}
 
storage::~storage()
{
    --storage::counter;
    std::cout << "Now we have "<< storage::counter << " links to Someclass\n";
    if(counter == 0)
    {
        std::cout << "Deleting pointer to Someclass\n";
        delete this->p;
    }
}
 
int storage::counter = 0;
 
bool storage::isNull()
{
    if(this->p)
    {
        return false;
    }
 
    return true;
}
 
Someclass* storage::getObjectByPointer()
{
    return this->p;
}
 
Someclass& storage::getObjectByLink()
{
    return *this->p;
}


Ну и архив:
0
Вложения
Тип файла: rar shared_ptr.rar (1.9 Кб, 13 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2012, 20:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализовал shared pointer class. В каких местах можно улучшить ? (C++):

Как вообще работают fstream.open(), class.pointer to massive? - C++
Мне надо узнать направление поиска информации общего характера по тому, как данная прога с большим числом циклов обменивается информацией с...

Чем можно улучшить прогу!Дополните) - C++
#include &lt;iostream&gt; using namespace std; enum {researsher,laborer,secratary,manager,accountant,executive}; class employe { ...

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

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int') - C++
Есть такие строки: std::list&lt;c_bullet*&gt; Bullets; ... for(auto i = Bullets.begin(); i != Bullets.end(); /**/) В строке цикла вот...

Shared_ptr - stored pointer, owned pointer - C++
Зачем в shared_ptr нужен хранимый указатель, отличный от владеемого? И так в этом средстве, вроде как предназначенном для уменьшения...

литература shared objects & dynamic shared objects - C++
Привет, товариСЧи. Подкиньте пожалуйста пару тройку книженций по теме инглиш тоже пойдет, но лучше рус. Добавлено через 42 минуты ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
29.01.2012, 00:41 #2
0. Сделайте же шаблонный класс.
1. Первый же вышедший из области видимости объект уничтожит указатель.
2. Нет оператора присваивания и конструктора копирования, что означает, что объект может быть скопирован обычным способом. Плохо -- пункт 1.
1
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.01.2012, 01:10 #3
1. это не шаред поинтер. с смысле не тот, который теперь в стандарте или в бусте.
2. это должен быть шаблонный класс.
Пока вы это не исправите, остальное комментировать нет смысла, потому что под эти два пункта переделать придется все, что вы уже написали.

Реализуйте для начала какой-нибудь смарт поинтер попроще
scoped_ptr
unique_ptr
auto_ptr

Вот тут небольшой обзорчик:
http://www.rsdn.ru/article/cpp/smartptr.xml
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2012, 01:10
Привет! Вот еще темы с ответами:

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

Какие ошибки есть в коде и что можно улучшить? - C++
Всем привет, есть вот такой код, подскажите, что у меня здесь не правильно и что можно было бы написать лучше(с точки зрения сложности...

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

Эмулятор Машины Тьюринга: посоветуйте, что можно добавить/улучшить - C++
Сделал эмулятор МТ на C++. Может, кому-то пригодится. Можете посоветовать, что можно добавить/улучшить. Файл src.txt - код на языке...


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

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

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