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

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

Войти
Регистрация
Восстановить пароль
 
 
Тамика
Котовчанин
870 / 450 / 142
Регистрация: 16.02.2010
Сообщений: 2,899
Записей в блоге: 27
#1

Копирующий конструктор - C++

13.02.2014, 19:23. Просмотров 810. Ответов 20
Метки нет (Все метки)

Добрый вечер всем!
Следущая проблема - решила создать свой персональный vector - int_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
43
44
45
46
47
48
49
50
51
52
53
54
55
class int_array
{
    int *mas, size, capacity;
public:
    int_array(): mas(0), size(0), capacity(0)
    {}
 
    ~int_array()
    {
        delete [] mas;
    }
    int_array(int n)
    {
        mas = new int[n];
        size = 0;
        capacity = n;
    }
    //copy constructor
    int_array(int_array& in)
    {
        *this = in;
    }
    int getSize() const
    {
        return size;
    }
    int getCapacity()
    {
        return capacity;
    }
 
    void resize(int n)
    {
        int *temp = new int[n];
        temp = mas;
        delete [] temp;
    }
    void push_back(int val)
    {
        if (size < capacity) mas[size++] = val; 
        // else throw ...  
    }
    void pop_back()
    {
        --size;
    }
    int operator[] (int n)
    {
        return mas[n];
    }
    int operator= (int n)
    {
        
    }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2014, 19:23     Копирующий конструктор
Посмотрите здесь:

копирующий конструктор !!! - C++
Вот это верный вид конструктора копирования??? class VK{ int b; public: VK(const VC &amp;); } VL::VK(const VK &amp; tmp){ b=tmp.b; ...

Копирующий конструктор - C++
Помогите пожалуйста реализовать копирующий конструктор, у меня он выдает нули =\ Вот код: #include &lt;iostream&gt; #include...

Копирующий конструктор - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;sstream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; #include&lt;string&gt; #include&lt;limits&gt; ...

Копирующий конструктор - C++
Здравствуйте, кто нибудь может сказать, почему при создании копирующего конструктора нужно указывать ссылку на объект? #include...

Закрытый копирующий конструктор - C++
В данном упражнении описана методика, которая может помочь отказаться от копирующих конструкторов. Создайте класс Х и объявите (но не...

копирующий конструктор и иерархия - C++
Создать иерархию типов, описывающую - студента, отца семейства и студента-отца семейства. Классы должны конструкторы, включая конструктор...

Копирующий конструктор абстрактного класа - C++
Добрый вечер. Сразу к делу. Есть абстрактный класс: class Product abstract { protected: int lipids; string brand; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.02.2014, 20:07     Копирующий конструктор #2
Цитата Сообщение от Тамика Посмотреть сообщение
//copy constructor
int_array(int_array& in)
{
*this = in;
}
Так указатель на память скопируется, а нужно содержимое этой памяти скопировать.

Добавлено через 4 минуты
Как-то так:
C++
1
2
3
4
5
6
7
8
9
//copy constructor
    int_array(const int_array& in)
    {
        size = in.size;
        capacity = in.capacity;
        mas = new int[capacity];
        for (int i = 0; i < size; ++i)
            mas[i] = in.mas[i];
    }
Тамика
Котовчанин
870 / 450 / 142
Регистрация: 16.02.2010
Сообщений: 2,899
Записей в блоге: 27
14.02.2014, 17:00  [ТС]     Копирующий конструктор #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Так указатель на память скопируется, а нужно содержимое этой памяти скопировать.

Добавлено через 4 минуты
Как-то так:
}[/CPP]
Не-а... Снова та же ошибка.
ДА и заносит в i не значения m, а мусор из кучи.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:07     Копирующий конструктор #4
Цитата Сообщение от Тамика Посмотреть сообщение
Не-а... Снова та же ошибка.
Та же - это какая?
Тамика
Котовчанин
870 / 450 / 142
Регистрация: 16.02.2010
Сообщений: 2,899
Записей в блоге: 27
14.02.2014, 17:10  [ТС]     Копирующий конструктор #5
Цитата Сообщение от Тамика Посмотреть сообщение
Мои попытки его воссоздать приводят к утечке памяти.
Вот эта.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:10     Копирующий конструктор #6
Цитата Сообщение от Тамика Посмотреть сообщение
ДА и заносит в i не значения m, а мусор из кучи.
О чём пишите? Кто-тот видит ваш код? Тут ясновидящих нет.
Тамика
Котовчанин
870 / 450 / 142
Регистрация: 16.02.2010
Сообщений: 2,899
Записей в блоге: 27
14.02.2014, 17:12  [ТС]     Копирующий конструктор #7
Цитата Сообщение от alsav22 Посмотреть сообщение
О чём пишите? Кто-тот видит ваш код? Тут ясновидящих нет.
А жаль.

Случайно не докопировала видимо.
Вот тестируемая програмка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    int_array m(5);
    for (int i =0 ; i < 5; ++ i)
    {
        m.push_back(i);
        std::cout << m[i] << std::endl;
    }
    std::cout << "\n" << m.getSize() << "\n";
    m.pop_back();
    m.resize(10);
    std::cout << m.getSize();
    std::cout << "Result of copy constructor\n";
    int_array i = m;
    for (int j = 0; j < m.getSize(); ++j)
    std::cout << i[j] << "\n";
}
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:12     Копирующий конструктор #8
Цитата Сообщение от Тамика Посмотреть сообщение
Вот эта.
Вот этот конструктор копирования:
C++
1
2
3
4
5
6
7
8
int_array(const int_array& in)
    {
        size = in.size;
        capacity = in.capacity;
        mas = new int[capacity];
        for (int i = 0; i < size; ++i)
            mas[i] = in.mas[i];
    }
не приводит к утечке памяти. Ещё вопросы?
Тамика
Котовчанин
870 / 450 / 142
Регистрация: 16.02.2010
Сообщений: 2,899
Записей в блоге: 27
14.02.2014, 17:16  [ТС]     Копирующий конструктор #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот этот конструктор копирования:
Почему тогда в коде выкидывает ошибку?
З.Ы. Вас не заставляют отвечать. А в коде ошибка. И я просто хочу узнать почему.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:20     Копирующий конструктор #10
Потому что вот здесь:
C++
1
2
std::cout << "Result of copy constructor\n";
int_array i = m;
работает не копирующий конструктор, а оператор присваивания (заданный по умолчанию). Ещё вопросы?
Тамика
Котовчанин
870 / 450 / 142
Регистрация: 16.02.2010
Сообщений: 2,899
Записей в блоге: 27
14.02.2014, 17:21  [ТС]     Копирующий конструктор #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Потому что вот здесь:
C++
1
2
std::cout << "Result of copy constructor\n";
int_array i = m;
работает не копирующий конструктор, а оператор присваивания (заданный по умолчанию). Ещё вопросы?
Есчё есть.
Это я увидела и изменила на int_array i(m);
Ситуация не изменилась.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:23     Копирующий конструктор #12
Цитата Сообщение от Тамика Посмотреть сообщение
Ситуация не изменилась.
Кака така ситуация?
raccoonlove
Заблокирован
14.02.2014, 17:24     Копирующий конструктор #13
Тамика, почитайте тут.
Тамика
Котовчанин
870 / 450 / 142
Регистрация: 16.02.2010
Сообщений: 2,899
Записей в блоге: 27
14.02.2014, 17:24  [ТС]     Копирующий конструктор #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Кака така ситуация?
Ошибка в виде BLOCK_TYPE_IS_INVALID. Выводит мусор...
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:28     Копирующий конструктор #15
А если закоментировать?
C++
1
 m.resize(10);
Может теперь дело не в копирующем конструкторе, а в кривом коде?
Тамика
Котовчанин
870 / 450 / 142
Регистрация: 16.02.2010
Сообщений: 2,899
Записей в блоге: 27
14.02.2014, 17:56  [ТС]     Копирующий конструктор #16
Цитата Сообщение от alsav22 Посмотреть сообщение
А если закоментировать?
C++
1
 m.resize(10);
Может теперь дело не в копирующем конструкторе, а в кривом коде?
Может.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 18:20     Копирующий конструктор #17
C++
1
2
3
4
5
6
7
8
9
void resize(int n)
    {
        int *temp = new int[n];
        capacity = n;
        for (int i = 0; i < size; ++i)
            temp[i] = mas[i];
        delete [] mas;
        mas = temp;
    }
Добавлено через 18 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Потому что вот здесь:
C++
1
2
std::cout << "Result of copy constructor\n";
int_array i = m;
работает не копирующий конструктор, а оператор присваивания
Тут соврал, работает здесь копирующий конструктор.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int_array& operator=(const int_array& in)
    {
        if (&in == this)
            return *this;
        delete [] mas;
        size = in.size;
        capacity = in.capacity;
        mas = new int[capacity];
        for (int i = 0; i < size; ++i)
            mas[i] = in.mas[i];
        return *this;
    }
DrOffset
6919 / 4112 / 940
Регистрация: 30.01.2014
Сообщений: 6,908
14.02.2014, 19:26     Копирующий конструктор #18
Цитата Сообщение от Тамика Посмотреть сообщение
Добрый вечер всем!
Следущая проблема - решила создать свой персональный vector - int_array.
А можно поинтересоваться, для чего писать персональный вектор?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
14.02.2014, 20:24     Копирующий конструктор #19
Цитата Сообщение от DrOffset Посмотреть сообщение
А можно поинтересоваться, для чего писать персональный вектор?
If you understand int and vector, you understand C++. The rest is "details" (1300+ pages of details). (Bjarne Stroustrup)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2014, 20:35     Копирующий конструктор
Еще ссылки по теме:

Когда в классе нужен копирующий конструктор? - C++
Меня интересует вопрос когда в классе нужен копирующий конструктор.

Копирующий конструктор в списке инициализации членов класса - C++
Добрый день. Сегодня обнаружил кое-что для себя странное и непонятное. В общем-то смотрим код: #include &lt;iostream&gt; ...

Копирующий конструктор класса, содержащего переменную-член указатель - C++
Практикуюсь по книге Стенли Липпмана &quot;Язык программирования C++ вводный курс&quot; 4 изд. Упражнение 13.4. Используя приведенный ниже набросок...

Конструктор - C++
Почему переменные не инициализируются???? class MainFuns{ public: string Name; int Number; bool Blocking;

Конструктор - C++
Всем доброго времени суток. Пишу программу, которая вычисляет ранг матрицы и выводит транспонированную. Вот код: matr.h: class matr {...


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

Или воспользуйтесь поиском по форуму:
DrOffset
6919 / 4112 / 940
Регистрация: 30.01.2014
Сообщений: 6,908
14.02.2014, 20:35     Копирующий конструктор #20
Цитата Сообщение от 0x10 Посмотреть сообщение
If you understand int and vector, you understand C++. The rest is "details" (1300+ pages of details). (Bjarne Stroustrup)
Это прекрасно.
Только я не за этим спрашивал. Если человек пишет вектор для использования в проекте на работе, то во-первых стоит посмотреть на существующие реализации (помимо std::vector). А во-вторых, если таковой не найдется, то мы все, и я, могли бы подсказать, как ее лучше написать.
То, что было продемонстрировано ТС годится только в качестве упражнения для обучения.
Чтобы выяснить истинную задачу (обучение для себя или решение вопроса на работе), и я и задал этот вопрос.
Yandex
Объявления
14.02.2014, 20:35     Копирующий конструктор
Ответ Создать тему
Опции темы

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