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

Оператор копирования для объектов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ C++ исправить ошибки http://www.cyberforum.ru/cpp-beginners/thread1150005.html
Помогите исправит ошибки=) #include <iostream> #include <stdio.h> #include <math.h> #include <conio.h> #include <time.h> using namespace std; int mas; int i,j,m,n,s,l,d;
C++ На входе строка любой длины, на выходе получить строку в обратном порядке дело было на собеседовании : задали такую задачу. На входе строка любой длины , на выходе получить строку в обратном порядке (ABC... ->...CBA ) я переволновался и написал такой код) и объяснить нечего не смог ((( как вы думаете это правильное решение? #include "stdafx.h" #include "iostream" #include "string.h" using namespace std; int _tmain(int argc, _TCHAR* argv) { http://www.cyberforum.ru/cpp-beginners/thread1150000.html
Задача коммивояжера - выход за пределы массива C++
Бьет ошибку! Я так понимаю где-то выход за пределы массива! Народ гляньте кто, а то я уже ничего не вижу! Может свежий взгляд увидит как исправить #include <vcl.h> #include <tchar.h> #include <stdio.h> #include <conio.h> //
C++ Найти два последовательных члена последовательности, среднее арифметическое которых ближе всего к определенному числу
Здравствуйте, помогите сделать задание, ни как не могу в него вникнуть: Компоненты файла f – целые (отличные от нуля) числа: х, y1, ... yn. Вывести на экран два последовательных члена этой последовательности, среднее арифметическое которых ближе всего к х. Выполнить задания для текстового и бинарного файлов.
C++ Заполнить двумерный массив 7x7 http://www.cyberforum.ru/cpp-beginners/thread1149931.html
Заполнить двумерный массив 7x7 следующим видом: Добавлено через 15 минут Спасибо, уже сделал, кому нужно, вот) //---------------------------------TwIx----------------------------------------- #include <iostream> #include <math.h> #include <stdlib.h> #include <vcl.h>
C++ Написать простую булевую функцию написать реализацию самой простой функции вычисления нелинейности одной булевой функции. Для отладки этой функции надо будет писать программу, в которой задавать какую-нибудь конкретную функцию, например, линейную или произведение переменных, а также выводить результат в файл для проверки. подробнее

Показать сообщение отдельно
higimo
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 10
16.04.2014, 12:05     Оператор копирования для объектов
Отсутствие, даже потенциальных, утечек памяти подразумевается.

Пишу класс, который реализует шаблонный динамический массив.

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
template <class T>
class CMyArray
{
public:
  // Конструктор
  CMyArray():
    m_size(0), m_array(nullptr)
  {}
 
  // Конструктор с единственным элементом
  CMyArray(T const & arg)
  {
    m_size = 1;
    m_array = new T[1];
    m_array[0] = arg;
  }
 
  // Копирующий конструктор (что, правильный?)
  CMyArray(CMyArray const & value)
  {
    delete [] m_array;
    m_size = value.m_size;
    m_array = new T[m_size + 1];
    for (size_t i = 0; i < m_size; i++)
    {
      m_array[i] = new T(value.m_array[i]);
    }
  }
 
  // Деструктор
  ~CMyArray()
  {
    delete [] m_array;
  }
 
  // Оператор присваивания (валится при присваивании с объктами вроде стринга)
  CMyArray & operator=(CMyArray const & other)
  {
    delete [] m_array;
    m_array = new T[other.m_size + 1];
    memcpy(m_array, other.m_array, other.m_size + 1);
    m_size = other.m_size;
    return *this;
  }
 
private:
  T *m_array;
  size_t m_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
template <class T>
class CCountable
{
public:
    static size_t GetInstanceCount()
    {
        return m_counter;
    }
protected:
    CCountable()
    {
        ++m_counter;
    }
    CCountable(CCountable const& other)
    {
        ++m_counter;
    }
    ~CCountable()
    {
        --m_counter;
    }
private:
    static size_t m_counter;
};
template<class T> size_t CCountable<T>::m_counter = 0;
Структура выбрасывающая исключения

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
struct MyStruct : CCountable<MyStruct>
{
    MyStruct():shouldThrowOnAssignmentOrCopy(false)
    {}
    
    MyStruct(MyStruct const& other):shouldThrowOnAssignmentOrCopy(other.shouldThrowOnAssignmentOrCopy)
    {
        if (shouldThrowOnAssignmentOrCopy)
        {
            throw std::runtime_error("OOPS");
        }
    }
    MyStruct & operator=(MyStruct const& other)
    {
        if (other.shouldThrowOnAssignmentOrCopy)
        {
            throw std::runtime_error("OOPS");
        }
 
        shouldThrowOnAssignmentOrCopy = other.shouldThrowOnAssignmentOrCopy;
        return *this;
    }
    bool shouldThrowOnAssignmentOrCopy;
};
Сами тесты

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
void TestThatWillFail()
{
    // Демонстрация, что тестирующая фигня работает
    assert(MyStruct::GetInstanceCount() == 0);
    {
        MyStruct s;
        assert(MyStruct::GetInstanceCount() == 1);
    }
    assert(MyStruct::GetInstanceCount() == 0);
 
    // Тестируем на вызовы конструкторов и деструкторов
    {
        CMyArray<MyStruct> arr0;
        arr0.Push((MyStruct()));
        try
        {
            CMyArray<MyStruct> arr;
            arr.Push((MyStruct()));
            assert(MyStruct::GetInstanceCount() == 2);
            arr[0].shouldThrowOnAssignmentOrCopy = true;
            arr0 = arr;
        }
        catch (...)
        {
            assert(arr0.Size() == 1);
            assert(MyStruct::GetInstanceCount() == 1);
        }
    }
    
    // Тестируем оператор присваивания
    {
        CMyArray<std::string> strings;
        strings.Push("Hello, this is Tester, I hope this test will fail");
        strings.Push("Hello, this is Tester, I hope this test will fail");
        CMyArray<std::string> strings1;
        strings1 = strings;
        //оператор копирования для объектов
    }
    {
        assert(MyStruct::GetInstanceCount() == 1);
        {
            try
            {
                MyStruct item;
                item.shouldThrowOnAssignmentOrCopy = true; 
                CMyArray<MyStruct> array(item);
            }
            catch(...){}
        }
        assert(MyStruct::GetInstanceCount() == 1);
 
    }
 
    assert(MyStruct::GetInstanceCount() == 0);
}
Я раньше оператор копирования писал как конструктор копирования (идентичный код был), но он валился на тестах, где проверялся вызов деструкторов. Когда копирую куски памяти появляется проблема с тем, что string не копируется на самом деле.

Помогите, как решить проблему? Может ссылка какая есть? Всякие свапы, которые кругом предлагают не покатят — класс шаблонный.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru