7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
1

Подскажите как переписать класс с использованием умных указателей, либо STL

22.06.2014, 06:14. Показов 1095. Ответов 5
Метки нет (Все метки)

К сожалению, знания об умных указателях и библиотеке STL прошли мимо меня...
Сейчас пытаюсь восполнить этот пробел, но уже третий день не могу понять как этим пользоваться.
Очень прошу помочь мне, показав, как описанный ниже класс перевести на умные указатели, или на векторы:

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
class test
{
private:
int           Amount;
int            x;
float*        y;
double**    z;
 
public:
 
test(int fAmount)
{
Amount = fAmount;
x = Amount;
y = new float[Amount];
z = new double*[Amount];
for(int i = 0; i < Amount; i++)
z[i] = new double[Amount];
}
 
~test(void)
{
delete[] y;
for(int i=0;i<Amount;i++)
{delete[] z[i];}
delete[] z;
}
 
};
Я сначала думал не сдаваться и писать в старом стиле, но когда увидел то огромное количество двумерных массивов , с которым придется работать, а значит и прописывать руками их удаление в деструкторе, просто сник.
Теперь читаю про умные указатели и про STL. Плохо понимаю что происходит.
Вот вопросы:
1) Умный указатель сам удаляет объект, когда это необходимо? Поддерживаются ли двумерные массивы?
2) Какой из классов STL лучше всего подойдет для замены стандартных двумерных массивов? Я правильно понял, что это vector?
3) Можно ли явно указать умному указателю и классу vector когда они больше не нужны? (например, создать двумерный вектор vec, затем написать vec.destroy() и он сразу исчезнет).
Буду благодарен за любую помощь, так как почему-то мозг затупил и никак не хочет воспринимать инструментом прочитанное мной об этом всем...

Добавлено через 1 час 18 минут
Сейчас усердно пытаюсь сделать вместо двойных указателей двойной вектор.
У меня получилось реализовать это в функции (все оказалось довольно просто).
Но как мне засунуть двумерный вектор в переменную класса???

Вот, что я использую внутри функции:

C++
1
vector< vector<int> > Matrix    (   n, vector<int>(m)   );
А как это засунуть в класс?
C++
1
2
3
4
5
6
7
8
9
class vec
{
private:
//Двумерный вектор, размер которого будет определен позже
 
public:
vec();
~vec();
};
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2014, 06:14
Ответы с готовыми решениями:

Как правильней переписать код с использованием умных указателей?
Всем привет. Есть код: TImage *im1 = new TImage(NULL); TImage *im2 = new TImage(NULL);...

Правильное использование умных указателей, как членов класса
Допустим у нас есть класс Node, объекты которого могут хранить вложенные Node, как правильнее...

Переписать с использованием STL Array
Доброго времени суток! Написал вот такую программу,теперь хочу тоже самое только с использованием...

Переписать функцию с использованием указателей
Подскажите пожалуйста как выполнить задание::wall: Перепишите функцию revers с использованием...

5
5489 / 4884 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.06.2014, 06:33 2
Цитата Сообщение от Divergence Посмотреть сообщение
А как это засунуть в класс?
C++
1
vector< vector<int> > Matrix;
1
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
22.06.2014, 06:35 3
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
#include <vector>
#include <iostream>
 
class test
{
private:
   int           Amount;
   int            x;
   std::vector<float> y;
   std::vector<std::vector<double> > z;
public:
 
test(int fAmount)
{
   Amount = fAmount;
   x = Amount;
   y.resize(Amount,0);
   z.resize(Amount);
   for(int i = 0; i < Amount; i++)
      z[i].resize(Amount);
}
void clear()
{
   std::cout<<y.size()<<" "<<y.capacity()<<"\n";
   y.clear(); //Очищает вектор, но не освобождает память, отведенную под данные
   z.clear();
   std::cout<<y.size()<<" "<<y.capacity()<<"\n";
#if __cplusplus > 199711L
   y.shrink_to_fit();
   z.shrink_to_fit();
#else
   std::vector<float> empty_y;
   std::vector<std::vector<double> > empty_z;
   y.swap(empty_y);
   z.swap(empty_z);
#endif
   std::cout<<y.size()<<" "<<y.capacity()<<"\n";
}
 
~test()
{
}
 
};
int main()
{
  test test_inst(100);
  test_inst.clear();
  return 0;
}
1
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
22.06.2014, 06:45  [ТС] 4
Спасибо большое за ответы!
Такая реализация грамотна?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class cTestVectors
{
public:
 
vector< vector<int> > Matrix;   
    
 
    cTestVectors(int x, int y)
    {
        Matrix.resize(x, vector<int>(y));
        
    } //Конец конструктора
    ~cTestVectors()
    {
           Matrix.clear();
//Или здесь нужно через цикл сначала удалить все элементы Matrix[i]???
    }
};
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
22.06.2014, 06:56 5
Вектор по-хорошему нужно бы убрать из public, деструктор можно не писать вообще, вектор при удалении освободит память сам.
1
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
22.06.2014, 06:59  [ТС] 6
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Вектор по-хорошему нужно бы убрать из public, деструктор можно не писать вообще, вектор при удалении освободит память сам.
О боже, как это шикарно!!!!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2014, 06:59
Помогаю со студенческими работами здесь

Переписать с использованием указателей и адресов
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #define n 10 int main (void) {...

Переписать программу с использованием указателей
Всем привет, написал программу теперь нужно сделать его с помощью указателей. помогите пожалуйста ...

Переписать код с использованием указателей
помогите пожалуйста, нужно не использовать а все сделать через указатели #include &quot;stdafx.h&quot;...

Переписать код с использованием указателей
Есть код на C,надо заменить на указатели. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include...

Переписать код с использованием указателей
Помогите сделать указатели... #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; ...

Переписать программу с использованием указателей
поменяйте, пожалуйста, из индексов в указатели #include &lt;stdio.h&gt;; int cmp_cresc ( const int* x,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru