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

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

Войти
Регистрация
Восстановить пароль
 
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
#1

Более практичный метод обнуления полей класса - C++

12.09.2013, 15:35. Просмотров 638. Ответов 8
Метки нет (Все метки)

Всем привет.
Программируя на досуге столкнулся с таким вопросом - "обнуление полей класса". Ну первое что пришло в голову это создание отдельного метода например Clear который бы сбрасывал значение полей класса на default'ные значения. Но такой подход мне не понравился так как этот метод будет необходимо постоянно модернизировать дополняя туда новые добавленые поля. И немного поразмыслив решил сделать вот так:
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
#include <memory>
class A
{
  int a;
  char b;
  double c;
  char* d;
  /*.....*/
 
  public:
 
    A()
    {
      Clear();
    }
   
   ~A()
   {
     if (d)
    {
     delete []d;
    }
   }
 
   void Clear()
   {
    if (d) delete [] d; 
    memset(this,0,*this);
   }
};
По этому хотел спросить знающих людей, каковы плюсы и минусы такого подхода. И есть какие подводные камни в моем подходе?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2013, 15:35     Более практичный метод обнуления полей класса
Посмотрите здесь:

Представление полей одного класса через другой C++
C++ Вывод полей класса после сравнения
Получения количества полей класса C++
Два класса, ошибка из-за приватности полей C++
Инициализация полей класса через vector<> C++
Все строки матрицы, где находится более двух простых чисел, обнулить. Найти среднее арифметическое элементов до и после обнуления C++
C++ Сортировка по одному из полей класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
12.09.2013, 15:41     Более практичный метод обнуления полей класса #2
Цитата Сообщение от stawerfar Посмотреть сообщение
memset(this,0,*this);
*this - это разве размер класса?
Убежденный
Системный программист
 Аватар для Убежденный
14634 / 6595 / 1045
Регистрация: 02.05.2013
Сообщений: 10,865
Завершенные тесты: 1
12.09.2013, 15:48     Более практичный метод обнуления полей класса #3
Цитата Сообщение от stawerfar Посмотреть сообщение
каковы плюсы и минусы такого подхода. И есть какие подводные камни в моем подходе?
Минус в том, что не все может быть затерто нулем.
Например, попробуйте затереть какой-нибудь std::vector, если он член класса.
Или если класс содержит виртуальную таблицу, она тоже может быть затерта.
В итоге получите segmentation fault.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
12.09.2013, 15:52     Более практичный метод обнуления полей класса #4
добрый день

используйте конструкторы по умолчанию для встроенных типов

C++
1
2
3
4
5
6
7
    char    ch = char();    // ch = '\0'
    bool    b = bool();     // b = false
    int     i = int();      // i = 0
    
    // для динамических массивов:
    char    *a1 = new char[10]();   // все элементы будут '\0'
    bool    *a2 = new bool[10]();   // все элементы будут false
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
12.09.2013, 15:59     Более практичный метод обнуления полей класса #5
Минусов в таком подходе - ой-ей-ей! Как правильно написал коллега Убежденный, запросто можете получить segfault. (Кстати, с таким безобразием я сталкивался в коде реального проекта. Пришлось сильно бить ногами программиста, любившего такое "обнуление".)

C++
1
2
3
    // для динамических массивов:
    char    *a1 = new char[10]();   // все элементы будут '\0'
    bool    *a2 = new bool[10]();   // все элементы будут false
Увы, это неверно. Не будут.
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
12.09.2013, 16:05     Более практичный метод обнуления полей класса #6
Цитата Сообщение от CheshireCat Посмотреть сообщение
Увы, это неверно. Не будут.
а что мешает проверить? у меня нули

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main()
{
    char    ch = char();    // ch = '\0'
    bool    b = bool();     // b = false
    int     i = int();      // i = 0
 
    // для динамических массивов:
    char    *a1 = new char[10]();   // все элементы будут '\0'
    bool    *a2 = new bool[10]();   // все элементы будут false
 
    for (int i=0; i!=10; ++i)
        cout << a2[i] << " "; // 0 0 0 0 0 0 0 0 0 0
    cout << endl;
 
    system("pause");
    return 0;
}
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
12.09.2013, 16:06  [ТС]     Более практичный метод обнуления полей класса #7
Цитата Сообщение от castaway Посмотреть сообщение
*this - это разве размер класса?
нуда опечатка забыл в sizeof(*this) засунуть
C++
1
memset(this,0,sizeof(*this));
В целом понял, большое спасибо за ответы
Убежденный
Системный программист
 Аватар для Убежденный
14634 / 6595 / 1045
Регистрация: 02.05.2013
Сообщений: 10,865
Завершенные тесты: 1
12.09.2013, 16:27     Более практичный метод обнуления полей класса #8
Цитата Сообщение от ___ Посмотреть сообщение
а что мешает проверить? у меня нули
По стандарту языка (С++03, 5.3.4, п.15), это справедливо только
для формы со скобочками, "new T[] ()" (new-initializer).
Если new-initializer отсутствует, объект создается неинициализированным.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 16:50     Более практичный метод обнуления полей класса
Еще ссылки по теме:

C++ Доступ к значениям полей класса
C++ Динамическое чтение полей класса Student из консоли
C++ Вывод полей класса через статический вектор
C++ В чем разница в задании полей класса?
C++ Инициализация полей во время объявления класса

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

Или воспользуйтесь поиском по форуму:
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
12.09.2013, 16:50     Более практичный метод обнуления полей класса #9
Цитата Сообщение от Убежденный Посмотреть сообщение
Если new-initializer отсутствует, объект создается неинициализированным.
все понятно

я не знаю, вот сколько раз это делал у себя, так всегда результат получается правильным.

а стандарт я плохо знаю. так что извините если где был не прав

Добавлено через 38 секунд
многого не знаю и могу ошибаться
Yandex
Объявления
12.09.2013, 16:50     Более практичный метод обнуления полей класса
Ответ Создать тему
Опции темы

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