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

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

Восстановить пароль Регистрация
 
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
12.09.2013, 15:35     Более практичный метод обнуления полей класса #1
Всем привет.
Программируя на досуге столкнулся с таким вопросом - "обнуление полей класса". Ну первое что пришло в голову это создание отдельного метода например 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++ Как описать метод класса? Как двумя способами описать инлайнируемый метод класса? Что такое this?
Получения количества полей класса C++
Два класса, ошибка из-за приватности полей C++
Все строки матрицы, где находится более двух простых чисел, обнулить. Найти среднее арифметическое элементов до и после обнуления C++
C++ Сортировка по одному из полей класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
12.09.2013, 15:41     Более практичный метод обнуления полей класса #2
Цитата Сообщение от stawerfar Посмотреть сообщение
memset(this,0,*this);
*this - это разве размер класса?
Убежденный
Системный программист
 Аватар для Убежденный
14193 / 6208 / 985
Регистрация: 02.05.2013
Сообщений: 10,341
Завершенные тесты: 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
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
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));
В целом понял, большое спасибо за ответы
Убежденный
Системный программист
 Аватар для Убежденный
14193 / 6208 / 985
Регистрация: 02.05.2013
Сообщений: 10,341
Завершенные тесты: 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++ Как передать в метод класса Menu указатель на метод дочернего класса?
Может ли метод родительского класса обратиться к полю дочернего класса C++

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

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

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

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

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

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