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

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

Восстановить пароль Регистрация
 
Divergence
 Аватар для Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
22.06.2014, 06:14     Подскажите как переписать класс с использованием умных указателей, либо STL #1
К сожалению, знания об умных указателях и библиотеке 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();
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2014, 06:14     Подскажите как переписать класс с использованием умных указателей, либо STL
Посмотрите здесь:

Переписать функцию с использованием указателей C++
C++ С++, как передать в функцию двумерный массив указателей на класс
C++ Подскажите, как определить формат чего-либо введенного с клавиатуры?
Как правильно создать двумерный массив указателей с использованием calloc? и ввод данных в него C++
абстрактный класс как реализовать данные, над которыми методы выполняют какие-либо действия C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.06.2014, 06:33     Подскажите как переписать класс с использованием умных указателей, либо STL #2
Цитата Сообщение от Divergence Посмотреть сообщение
А как это засунуть в класс?
C++
1
vector< vector<int> > Matrix;
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
22.06.2014, 06:35     Подскажите как переписать класс с использованием умных указателей, либо STL #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;
}
Divergence
 Аватар для Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
22.06.2014, 06:45  [ТС]     Подскажите как переписать класс с использованием умных указателей, либо STL #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]???
    }
};
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
22.06.2014, 06:56     Подскажите как переписать класс с использованием умных указателей, либо STL #5
Вектор по-хорошему нужно бы убрать из public, деструктор можно не писать вообще, вектор при удалении освободит память сам.
Divergence
 Аватар для Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
22.06.2014, 06:59  [ТС]     Подскажите как переписать класс с использованием умных указателей, либо STL #6
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Вектор по-хорошему нужно бы убрать из public, деструктор можно не писать вообще, вектор при удалении освободит память сам.
О боже, как это шикарно!!!!
Yandex
Объявления
22.06.2014, 06:59     Подскажите как переписать класс с использованием умных указателей, либо STL
Ответ Создать тему
Опции темы

Текущее время: 14:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru