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

Большое количество вызовов констр-ра и дестр-ра - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ График функции http://www.cyberforum.ru/cpp-beginners/thread327255.html
Построить график функции.
C++ Что такое HIPPO технология? Подскажите пожалуйста что такое HIPPO технология? ее преимущество и недостатки? http://www.cyberforum.ru/cpp-beginners/thread327241.html
C++ Наименьшее натуральное число n, представимое двумя различными способами
Найти наименьшее натуральное число n, представимое двумя различными способами в виде суммы кубов двух натуральных чисел X^3 + Y^3 (X ≥ Y) . Добавлено через 27 минут Может кому-нибудь понадобится. #include <stdio.h> #include <math.h> #include <conio.h> unsigned short int i1,j1,i2,j2,n,x=1; void main()
Запись системного времени в файл. C++
Добрый день гуру! Есть программка недоработанная. Перехватывает все нажатые клавиши и пишет их в файл. Но все символы идут сплошным текстом. Хочу вставить системное время, потом перехваченные клавиши и сброс на новую строку. Пример: "дата, время" - "перехваченные клавиши" ...... 2.12.2011, 01:57 - "перехваченные клавиши" 2.12.2011, 01:58 - "перехваченные клавиши"
C++ Указатель((( http://www.cyberforum.ru/cpp-beginners/thread327179.html
Составить программу, которая подсчитывает для из массивов А и В количество различных по значению элементов в каждом из этих массивов. Инициализацию, вывод элементов массива, их обработку организовать в отдельных функциях
C++ цикл while в с две задачки в программировании с . Я прсто дуб дубом не имею представления какой код писать эту тему пропустил, надо при помощи while . начало примерно такое #include <iostream> using namespace std; void main() { setlocale (0, "Russian"); подробнее

Показать сообщение отдельно
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
28.06.2011, 17:50     Большое количество вызовов констр-ра и дестр-ра
Добрый день!
Есть класс для подсчёта указателей на объект и класс, который сопровождает или поддерживает работу предыдущего, храня на него указатель.
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
RefPointer.h
#pragma once
#include "StdAfx.h"
#define NDEBUG
 
template <typename T>
class RefPointer
{
public:
    RefPointer<T>(RefCount<T>* p = NULL) : ptr(p)
    { if(p) p->ref(); }
    RefPointer<T>(const RefPointer& p) { if(p.ptr) p.ptr->ref(); ptr = p.ptr; std::cout<<"refpointer()\n"; }
    ~RefPointer<T>() { release(); std::cout<<"~refpointer()\n"; }
public:
    RefPointer<T>& operator=(const RefPointer<T>& rhs)
    {
        setPointer(rhs.ptr);
        return *this;
    }
    RefPointer<T>& operator=(RefCount<T>& rhs)
    {
        setPointer(rhs);
        return *this;
    }
 
    //dereference operators
    RefCount<T>* get() const { check(); return ptr; } 
    RefCount<T>* operator->() { check(); return ptr; } 
    T& operator*() { check(); return *ptr; }
 
private:
    void setPointer(RefCount<T>* p) 
    { if(p) p->ref(); release(); ptr = p; }
    void release()
    { if(ptr && ptr->unref() == 0) delete ptr; }
 
#if defined NDEBUG
    void check() {}
#else
    void check()
    { assert(ptr != NULL || ptr->getCountForDebuggingOnly()); }
#endif
 
private:
    RefCount<T>* ptr;
};
 
template <typename T>
bool operator==(const RefPointer<T>& lhs, const RefPointer<T>& rhs ) 
{
    RefCount<T>* ltmp = lhs.get();
    RefCount<T>* rtmp = rhs.get();
    return (ltmp && rtmp) ? *ltmp == *tmp : ltmp == rtmp;
};
 
template <typename T>
bool operator!=(const RefPointer<T>& lhs, const RefPointer<T>& rhs ) 
{
    return !operator==<T>(lhs,rhs);
};
 
template <typename T>
bool operator<(const RefPointer<T>& lhs, const RefPointer<T>& rhs ) 
{
    RefCount<T>* ltmp = lhs.get();
    RefCount<T>* rtmp = rhs.get();
    return (ltmp && rtmp) ? *ltmp < *tmp : ltmp < rtmp;
};
 
template <typename T>
bool operator>(const RefPointer<T>& lhs, const RefPointer<T>& rhs ) 
{
    return !operator< <T>(lhs,rhs);
};
 
RefCount.h
#pragma once
#include "StdAfx.h"
 
template <typename Object>
class RefCount
{
    template <typename Object>
    friend class RefPointer;
public:
    RefCount<Object>(Object* p = NULL) : cpObject(p), count(0) {}
public:
    Object& operator*() const
    {
        return *cpObject;
    }
private:
    void ref() 
    {
        ++count;
    }
    unsigned unref() const
    {
        return --count;
    }
    
    unsigned getCountForDebuggingOnly() const //Only for debugging!
    { return count; }
private:
    mutable unsigned count;
    const Object* cpObject;
};
 
//main
#include "StdAfx.h"
 
template <typename T>
void foo(RefPointer<T>* p)
{
    std::vector<RefPointer<T> > v(3);
    for(int i = 0; i < 3; ++i)
        v.push_back(RefPointer<T>(*p));
    v.push_back(*p);
    //std::cout<<(*p)<<' ';
}
 
int main()
{
    RefPointer<int> ptr(new RefCount<int>(new int(5)));
    foo<int>(&ptr);
    std::cout<<"foo worked!\n";
    return 0;
}
На выходе:

refpointer()
~refpointer()
refpointer()
~refpointer()
refpointer()
~refpointer()
refpointer()
refpointer()
refpointer()
refpointer()
~refpointer()
~refpointer()
~refpointer()
refpointer()
~refpointer()
refpointer()
refpointer()
refpointer()
refpointer()
refpointer()
~refpointer()
~refpointer()
~refpointer()
~refpointer()
refpointer()
~refpointer()
refpointer()
refpointer()
~refpointer()
refpointer()
refpointer()
refpointer()
refpointer()
refpointer()
refpointer()
~refpointer()
~refpointer()
~refpointer()
~refpointer()
~refpointer()
~refpointer()
refpointer()
~refpointer()
~refpointer()
~refpointer()
~refpointer()
~refpointer()
~refpointer()
~refpointer()
foo worked!
~refpointer()
Для продолжения нажмите любую клавишу . . .


Первые 13 строк понятны, но что происходит после этого? Что является причиной стольких вызовов конструкторов и деструкторов?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru