6 / 4 / 3
Регистрация: 28.10.2014
Сообщений: 147
1

Константные и неконстантные методы в классе

28.06.2018, 21:25. Показов 2735. Ответов 13
Метки нет (Все метки)

Здравствуйте! Вот задача
Реализуйте шаблонную версию класса Array. Список всех операций, которые должен поддерживать класс Array, приведен в шаблоне кода.
https://stepik.org/lesson/563/step/6?unit=886
Я наверное не очень понимаю смысл задачи потому что моя реализация немного отличается от той , которую я нашёл на киберфоруме Реализовать шаблонную версию класса Array
И ещё я не понимаю зачем нужно делать две почти одинаковой перегрузке [ ]
Моя реализация
Кликните здесь для просмотра всего текста

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
template <typename T>
class Array
{
public:
 
    explicit Array(size_t size,const T& value =T()):size_(size),data(new T[size_])
    {
        for (int i=0;i<size_;i++)
            data[i]=value;
    }
    Array (const Array & P):size_(P.size_),data(new T(size_))
    {
            for (int i=0;i<size_;i++)
                data[i]=P.data[i];
    }
 
    ~Array()
    {
        delete []data;
    }
    
    Array &operator=(Array P)
    {
        return Array(P.data,P.size_);
    }
    size_t size() const
    {
        return this->size_;
    }
        //оператор доступа по индексу
    T   & operator[](size_t i) 
    {
        return data[i];
    }
    const T   & operator[](size_t i) const
    {
        return data[i];
    }
//  private:
    T* data;
    size_t size_;
};
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2018, 21:25
Ответы с готовыми решениями:

Константные поля и методы
А можете объяснить, что такое константные поля и методы в классах?

Дублирование кода и константные методы
Есть метод method возвращающий ссылку на внутреннее значение объекта. Существует в двух вариантах -...

Константные методы и объекты класса
Это необходимость, или явная подстраховка того, что бы объект (константный) работал с себе...

Как правильно объявлять статические константные объекты в классе?
В классе надо объявить статичные константные строки. Типа class A { public: static const...

13
132 / 52 / 43
Регистрация: 09.05.2015
Сообщений: 562
28.06.2018, 21:35 2
один оператор[] который константный, чтобы просматривать значение
другой оператор[] который НЕ константный, чтобы значение изменять

Добавлено через 1 минуту
например оператор[i] = 10; неконстантный
cout << оператор[i]; константа
1
6 / 4 / 3
Регистрация: 28.10.2014
Сообщений: 147
28.06.2018, 21:37  [ТС] 3
Полностью с Вами согласен, но разве нельзя ограничиться просто неконстантным и всё?
0
132 / 52 / 43
Регистрация: 09.05.2015
Сообщений: 562
28.06.2018, 21:47 4
Цитата Сообщение от yuriybolotin99 Посмотреть сообщение
ограничиться просто неконстантным
это сделано, чтобы программа случайно не изменила значение когда это не нужно
1
6 / 4 / 3
Регистрация: 28.10.2014
Сообщений: 147
28.06.2018, 21:49  [ТС] 5
Приведите ,пожалуйста , пример ,когда такое может произойти
0
132 / 52 / 43
Регистрация: 09.05.2015
Сообщений: 562
28.06.2018, 22:16 6
Цитата Сообщение от yuriybolotin99 Посмотреть сообщение
когда такое может произойти
В учебниках не приводят даже. Пишут что программа может сбойнуть, представь себе программу из 10к строк, из тысячи разных функций, какая нибудь да может повлиять и изменить значение, и тогда толку от твоей программы, а ты попробуй найди где ошибка, ведь в принципе неконстантное значение не противоречит синтаксису языка. Поэтому, чтобы не рисковать, в функциях где ты не изменяешь значение, пиши константу. А то потом нехило поплатишься
1
23 / 30 / 11
Регистрация: 11.06.2018
Сообщений: 116
28.06.2018, 23:14 7
Лучший ответ Сообщение было отмечено yuriybolotin99 как решение

Решение

Цитата Сообщение от yuriybolotin99 Посмотреть сообщение
разве нельзя ограничиться просто неконстантным и всё?
В объяснении этого не стоит усложнять и приводить потенциальные проблемы больших проектов. Вам они все равно не по уровню пока.
Проще и понятнее представить ваш шаблон Array и объект-константу:
C++
1
const Array<int> arr(10, 42); // константный объект, массив из 10 элементов со значением 42
И в этом случае вы не сможете пользоваться неконстантной версией оператора, зато сможете константной. Оставить только константную вы тоже не сможете, т.к., в случае изменяемых объектов, вам таки понадобится изменять значения в массиве. Поэтому, раз уж такая сущность как Array - это шаблон общего назначения, вы должны учесть все стандартные сценарии его применения, предоставив обе версии оператора.
2
6 / 4 / 3
Регистрация: 28.10.2014
Сообщений: 147
02.07.2018, 23:10  [ТС] 8
Спасибо большое за пояснение! Если Вы "погрузились" в мой вопрос можете подсказать почему Стёпик не принимает моё решение?
0
Don't worry, be happy
17759 / 10527 / 2030
Регистрация: 27.09.2012
Сообщений: 26,503
Записей в блоге: 1
03.07.2018, 05:51 9
Цитата Сообщение от yuriybolotin99 Посмотреть сообщение
C++
1
2
3
4
    Array &operator=(Array P)
    {
        return Array(P.data,P.size_);
    }
Как-то так:
C++
1
2
3
4
5
6
7
8
    Array &operator=(const Array & src)
    {
        if (this != &src) {
           //Удаляем старые данные из массива
           //Кидаем в массив новые
        }
        return *this;
    }
1
6 / 4 / 3
Регистрация: 28.10.2014
Сообщений: 147
05.07.2018, 19:18  [ТС] 10
Да спасибо большое я переделал оператор присваивания!
Но почему-то Стёпик продолжает ругаться
Кликните здесь для просмотра всего текста
Compilation error
main.cpp: In function ‘bool check_assignment()’:
main.cpp:243:15: error: no matching function for call to ‘Array<Trace>::Array()’
Array<Trace> copy;
^~~~
main.cpp:84:2: note: candidate: Array<T>::Array(const Array<T>&) [with T = Trace]
Array (const Array & P):size_(P.size_),data(new T(size_))
^~~~~
main.cpp:84:2: note: candidate expects 1 argument, 0 provided
main.cpp:79:11: note: candidate: Array<T>::Array(size_t, const T&) [with T = Trace; size_t = long unsigned int]
explicit Array(size_t size,const T& value =T()):size_(size),data(new T[size_])
^~~~~
main.cpp:79:11: note: candidate expects 2 arguments, 0 provided
main.cpp: In instantiation of ‘Array<T>& Array<T>::operator=(const Array<T>&) [with T = Trace]’:
main.cpp:187:11: required from here
main.cpp:100:8: error: invalid use of member function ‘size_t Array<T>::size() const [with T = Trace; size_t = long unsigned int]’ (did you forget the ‘()’ ?)
size=P.size_;
~~~~^~~~~~~~

Кликните здесь для просмотра всего текста

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
template <typename T>
class Array
{
public:
 
    explicit Array(size_t size,const T& value =T()):size_(size),data(new T[size_])
    {
        for (int i=0;i<size_;i++)
            data[i]=value;
    }
    Array (const Array & P):size_(P.size_),data(new T(size_))
    {
            for (int i=0;i<size_;i++)
                data[i]=P.data[i];
    }
 
    ~Array()
    {
        delete []data;
    }
    
    Array &operator=(Array const &P)
    {
        if(this!=&P)
        {
            delete [] data;
            size=P.size_;
            data=new T[size_];
            for(int i=0;i<size_;i++)
                data[i]=P.data[i];
        }
        return *this;
        
    }
    size_t size() const
    {
        return this->size_;
    }
        //оператор доступа по индексу
    T   & operator[](size_t i) 
    {
        return data[i];
    }
    const T   & operator[](size_t i) const
    {
        return data[i];
    }
//  private:
    T* data;
    size_t size_;
};
0
Don't worry, be happy
17759 / 10527 / 2030
Регистрация: 27.09.2012
Сообщений: 26,503
Записей в блоге: 1
05.07.2018, 19:28 11
C++
1
2
            size=P.size_;//size_ = P.size_;
            data=new T[size_];
Добавлено через 2 минуты
C++
1
2
3
4
Array (const Array & P):size_(P.size_),data(new T(size_))
//...
    T* data;
    size_t size_;
Сначала будет инициализирован data и только затем size_. Так что:
C++
1
Array (const Array & P):data(new T(P.size_)), size_(P.size_)
В другом конструкторе такая же беда.
1
6 / 4 / 3
Регистрация: 28.10.2014
Сообщений: 147
05.07.2018, 20:39  [ТС] 12
Спасибо, знал что порядок инициализации важен,но не думал ,что порядок инициализации может зависеть от порядка объявления. Исправил) опечатку(
Но мне кажется , что они хотят чтобы в этот шаблон можно было загнать не только одномерный массив, но и двумерный. Потому что я не могу понять что им ещё может не нравится ,ведь у меня на VS2012 всё работает?
Кликните здесь для просмотра всего текста

^~~~
main.cpp:84:2: note: candidate: Array<T>::Array(const Array<T>&) [with T = Trace]
Array (const Array & P):size_(P.size_),data(new T(size_))
^~~~~
main.cpp:84:2: note: candidate expects 1 argument, 0 provided
main.cpp:79:11: note: candidate: Array<T>::Array(size_t, const T&) [with T = Trace; size_t = long unsigned int]
explicit Array(size_t size,const T& value =T()):size_(size),data(new T[size_])
^~~~~
main.cpp:79:11: note: candidate expects 2 arguments, 0 provided

Кликните здесь для просмотра всего текста
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
template <typename T>
class Array
{
public:
 
    explicit Array(size_t size,const T& value =T()):size_(size),data(new T[size_])
    {
        for (int i=0;i<size_;i++)
            data[i]=value;
    }
    Array (const Array & P):size_(P.size_),data(new T(size_))
    {
            for (int i=0;i<size_;i++)
                data[i]=P.data[i];
    }
 
    ~Array()
    {
        delete []data;
    }
    
    Array &operator=(Array const &P)
    {
        if(this!=&P)
        {
            delete [] data;
            size_=P.size_;
            data=new T[size_];
            for(int i=0;i<size_;i++)
                data[i]=P.data[i];
        }
        return *this;
        
    }
    size_t size() const
    {
        return this->size_;
    }
        //оператор доступа по индексу
    T   & operator[](size_t i) 
    {
        return data[i];
    }
    const T   & operator[](size_t i) const
    {
        return data[i];
    }
    private:
    size_t size_;
    T* data;
 
};
0
Don't worry, be happy
17759 / 10527 / 2030
Регистрация: 27.09.2012
Сообщений: 26,503
Записей в блоге: 1
05.07.2018, 21:38 13
Лучший ответ Сообщение было отмечено yuriybolotin99 как решение

Решение

Цитата Сообщение от yuriybolotin99 Посмотреть сообщение
data(new T(size_))
Это создание одного объекта, а не size_ объектов.
explicit Array(size_t size,const T& value =T()):size_(size),data(new T[size_])
А по ссылке (на степике) так:
C++
1
explicit Array(size_t size = 0, const T& value = T())
То есть параметр size задан по-умолчанию, и этот конструктор может использоваться в качестве конструктора без параметров.
1
6 / 4 / 3
Регистрация: 28.10.2014
Сообщений: 147
05.07.2018, 22:53  [ТС] 14
Спасибо Вам и всем кто отвечал за ответы ! Очень грустно понимать что бОльшая часть ошибок это опечатки( и невнимательность(((
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2018, 22:53
Помогаю со студенческими работами здесь

Константные и не константные ссылки. Приведения типов. Нужно уточнение
Не очень понимаю в чем различие (2,3 строчки). int x = 10; double &amp;y = x; const double &amp;y...

Зачем в C++ существуют неконстантные итераторы?
Зачем в C++ существуют неконстантные итераторы? Почему было позволено изменять коллекции во время...

Неправильно работают методы в классе
Есть класс GameObject в котором есть виртуальный метод draw: class GameObject { public: float...

Не работают методы в классе с контейнером map
#include &lt;map&gt; #include &lt;iostream&gt; #include &lt;string&gt; class Superclass { map&lt;long,long&gt;...


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

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

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