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

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

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

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

22.06.2014, 06:14. Просмотров 423. Ответов 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();
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2014, 06:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подскажите как переписать класс с использованием умных указателей, либо STL (C++):

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

Переписать функцию с использованием указателей - C++
Подскажите пожалуйста как выполнить задание::wall: Перепишите функцию revers с использованием указателей #include &lt;iostream&gt; ...

Переписать приведенный код с использованием указателей - C++
Есть такой код с функциями. Надо его реализовать через указатели. 3 задания к лабе сделал, а вот ето незнаю как( #include &lt;stdio.h&gt; ...

Переписать код с использованием указателей на функцию - C++
Помогите вот эту программу переделать на указатели! Спасибо всем) #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;conio.h&gt; ...

Использование умных указателей - C++
В каких случаях вы используете умные указатели, а в каких обычные?

Приведение типов умных указателей - C++
Добрый день. Реализовал простенький умный указатель с подсчетом ссылок. template&lt;typename object_t&gt; class Ptr { public: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.06.2014, 06:33 #2
Цитата Сообщение от Divergence Посмотреть сообщение
А как это засунуть в класс?
C++
1
vector< vector<int> > Matrix;
uglyPinokkio
326 / 229 / 41
Регистрация: 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;
}
Divergence
7 / 7 / 0
Регистрация: 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]???
    }
};
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
22.06.2014, 06:56 #5
Вектор по-хорошему нужно бы убрать из public, деструктор можно не писать вообще, вектор при удалении освободит память сам.
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
22.06.2014, 06:59  [ТС] #6
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Вектор по-хорошему нужно бы убрать из public, деструктор можно не писать вообще, вектор при удалении освободит память сам.
О боже, как это шикарно!!!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2014, 06:59
Привет! Вот еще темы с ответами:

Как создать класс со вложенной структурой указателей на класс? - C++
В классе Concept хранится массив (точнее map) структур Rel. Сама же структура Rel должна содержать указатели на класс Concept. ...

Объясните как записать код программы с использованием указателей - C++
Раскрасить в массиве при выводе бирюзовым цветом отрицательные элементы на главной диагонали, стоящие после этого минимального элемента. ...

Использование указателей на контейнеры STL в заголовочных файлах - C++
Для использования указателей на I/O классы достаточно включить &lt;iosfwd&gt; который содержит опережающие объявления и таким образом появляется...

Как передать в функцию двумерный массив указателей на класс? - C++
у меня есть std::vector&lt;Monster*&gt; monsters; Rect *pole; int pacmen_distance; Monster и Rect два...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.06.2014, 06:59
Ответ Создать тему
Опции темы

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