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

Мой синглтон. Дайте рекомендации, оцените, пожалуйста - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Стоит ли проверять результат выполнения new? http://www.cyberforum.ru/cpp-beginners/thread1104876.html
Начал изучать С++ и очень часто в книге, в примерах, не проверяют значение, возвращаемое оператором new. Ну понятно, что new может вернуть NULL, когда не будет достаточно хипа для выполнения запроса. А есть ли еще какие-либо моменты, когда new вернет NULL и стоит ли проверять результат?
C++ Создать класс String и перегрузить операторы Написать программу, демонстрирующую работу класса : b) Создать класс String – строку, используя динамическую память. Определить операторы "+" –сложение строк, "=" и "+=" – присваивания, как дружественные функции. Определить операторы сравнения "==", "!=", "<", ">", как методы класса. Операторы должны работать как со String, так и с char*. Определить оператор "" для доступа к каждому символу в... http://www.cyberforum.ru/cpp-beginners/thread1104850.html
C++ Классы с динамическими структурами данных. Перегрузить операции присваивания
Выполнить задание не используя библиотеку стандартных шаблонов. 1. Для типа динамической структуры данных, указанного в задании, разработать соответствующий класс, предусмотрев в нем конструкторы по умолчанию и копирования, деструктор, функции вставки и удаления элемента, просмотра доступного элемента, функцию, проверяющую наличие элементов. 2. Перегрузить операции присваивания. 3....
C++ Множественное наследование с использованием абстрактных базовых классов
Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций обработки исключительных ситуаций. Задание к практической работе Общая постановка. Создать программу с абстрактным базовым классом и множественным наследованием, реализовать в нем: • конструктор, • деструктор, • виртуальную функцию просмотра текущего состояния...
C++ Создать иерархию классов датчик – абстрактный базовый класс и датчики температуры, влажности и скорости ветра http://www.cyberforum.ru/cpp-beginners/thread1104843.html
а) Создать иерархию классов датчик – абстрактный базовый класс и датчики температуры, влажности и скорости ветра. Для каждого класса определить свои единицы измерения и способ снятия данных о значениях состояния окружающей среды. Определить конструктор копирования, оператор присваивания через соответствующие функции базового класса. Продемонстрировать работу классов. b) Создать класс...
C++ Создать иерархии наследования: книга, тетрадь – записная книжки Необходимо создать две программы, которые иллюстрировали бы оба приведенных выше примера множественного наследования. Создать динамический массив объектов, инициализировать его. Организовать поиск элемента в массиве по заданному значению. a) Создать иерархии наследования: книга, тетрадь – записная книжки. b) Создать иерархии наследования: бумага - книга, тетрадь – записная ... подробнее

Показать сообщение отдельно
Юрий Ч
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 149
26.02.2014, 12:05  [ТС]     Мой синглтон. Дайте рекомендации, оцените, пожалуйста
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Файл "Z:\programming\classes_cpp\general\gen_Tsi_pat\gen_Tsi_pat.h"
 
#ifndef __GEN_TSI_PAT_H_
#define __GEN_TSI_PAT_H_
 
#define PROTO_IFACE(D_iface, D_an)    \
    template<> void anFill<D_iface>(An<D_iface>& D_an)
 
#define DECLARE_IMPL(D_iface)    \
    PROTO_IFACE(D_iface, a);
 
#define BIND_TO_IMPL(D_iface, D_impl)    \
    PROTO_IFACE(D_iface, a) { a.create<D_impl>(); }
 
#define BIND_TO_SELF(D_impl)    \
    BIND_TO_IMPL(D_impl, D_impl)
 
#define BIND_TO_IMPL_SINGLE(D_iface, D_impl)    \
    PROTO_IFACE(D_iface, a) { a = anSingle<D_impl>(); }
 
#define BIND_TO_SELF_SINGLE(D_impl)    \
    BIND_TO_IMPL_SINGLE(D_impl, D_impl)
 
#define BIND_TO_IFACE(D_iface, D_ifaceFrom)    \
    PROTO_IFACE(D_iface, a) { anFill<D_ifaceFrom>(a); }
 
#define BIND_TO_PROTOTYPE(D_iface, D_prototype)    \
    PROTO_IFACE(D_iface, a) { a.copy(anSingle<D_prototype>()); }
 
#include <memory>
#include <string>
 
 
 
template<typename T>
struct An
{
    template<typename U>
    friend struct An;
 
    An()                              {}
 
    template<typename U>
    An(const An<U>& a) : data(a.data) {}
 
    template<typename U>
    An(An<U>&& a) : data(std::move(a.data)) {}
 
    T* operator->()                   { return get0(); }
    const T* operator->() const       { return get0(); }
    bool isEmpty() const              { return !data; }
    void clear()                      { data.reset(); }
    void init()                       { if (!data) reinit(); }
    void reinit()                     { anFill(*this); }
    
    T& create()                       { return create<T>(); }
 
    template<typename U>
    U& create()                       { U* u = new U; data.reset(u); return *u; }
    
    template<typename U>
    void produce(U&& u)               { anProduce(*this, u); }
 
    template<typename U>
    void copy(const An<U>& a)         { data.reset(new U(*a.data)); }
 
private:
    T* get0() const
    {
        const_cast<An*>(this)->init();
        return data.get();
    }
 
    std::shared_ptr<T> data;
};
 
 
template<typename T>
struct AnAutoCreate : An<T>
{
    AnAutoCreate()     { create(); }
};
 
template<typename T>
T& single()
{
    static T t;
    return t;
}
 
template<typename T>
An<T> anSingle()
{
    return single<AnAutoCreate<T>>();
}
 
 
template<typename T>
void anFill(An<T>& a)
{
    throw std::runtime_error(std::string("Cannot find implementation for interface: ")
            + typeid(T).name());
}
 
#endif // __GEN_TSI_PAT_H_
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
// h
 
#include "Z:\programming\classes_cpp\general\gen_Tsi_pat\gen_Tsi_pat.h"
 
 
struct X
{
    X()            { x = 1; }
    
    int x;
};
 
// декларация заливки реализации
DECLARE_IMPL(X)
 
int init();
 
// cpp
 
struct Y : X
{
    Y()            { x = 2; }
        
    int y;
};
 
// связывание декларации X и реализации Y используя синглтон
BIND_TO_IMPL_SINGLE(X, Y)
 
 
int init()
{
 
    An<X> x;    
    return x->x;             //!!! Возврящает 1, а в статье говорится, что вернул 2. 
 
}
Попробовал пример синглтона из статьи http://habrahabr.ru/post/118368/, но что-то нет того функционала (см. //!!!), что описан в статье. Может я что-то не так делаю?
 
Текущее время: 14:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru