Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

12.09.2013, 15:35. Просмотров 765. Ответов 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);
   }
};
По этому хотел спросить знающих людей, каковы плюсы и минусы такого подхода. И есть какие подводные камни в моем подходе?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2013, 15:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Более практичный метод обнуления полей класса (C++):

Все строки матрицы, где находится более двух простых чисел, обнулить. Найти среднее арифметическое элементов до и после обнуления - C++
Задана матрица натуральных чисел A(n,n). Все строки, где находится более двух простых чисел, обнулить. Найти среднее арифметическое...

Как передать в метод класса Menu указатель на метод дочернего класса? - C++
Как передать в метод базового класса указатель на метод дочернего: class Menu() { protected: setCallback(*********); //...

Как описать метод класса? Как двумя способами описать инлайнируемый метод класса? Что такое this? - C++
Раздел 1. Строки: нужен фрагмент кода. Обязательно используйте функции для работы со строками. Как найти адрес последнего символа строки?...

Создать для класса виртуальный метод, возвращающий уникальный идентификатор класса - C++
В курсаче по ООП сказано создать для класса виртуальный метод,возвращающий уникальный идентификатор класса. Вопрос в том, что это такое?

Может ли метод родительского класса обратиться к полю дочернего класса - C++
Может ли метод родительского класса обратиться к полю дочернего класса?

Как в методе класса вызвать другой метод того же класса? - C++
class mate { public: int AplusB(int A, int B) { return A+B; } int AplusBplusC(int A, int B, int C)

8
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
12.09.2013, 15:41 #2
Цитата Сообщение от stawerfar Посмотреть сообщение
memset(this,0,*this);
*this - это разве размер класса?
0
Убежденный
Ушел с форума
Эксперт С++
15794 / 7231 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.09.2013, 15:48 #3
Цитата Сообщение от stawerfar Посмотреть сообщение
каковы плюсы и минусы такого подхода. И есть какие подводные камни в моем подходе?
Минус в том, что не все может быть затерто нулем.
Например, попробуйте затереть какой-нибудь std::vector, если он член класса.
Или если класс содержит виртуальную таблицу, она тоже может быть затерта.
В итоге получите segmentation fault.
2
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
1
CheshireCat
Эксперт С++
2899 / 1248 / 78
Регистрация: 27.05.2008
Сообщений: 3,414
12.09.2013, 15:59 #5
Минусов в таком подходе - ой-ей-ей! Как правильно написал коллега Убежденный, запросто можете получить segfault. (Кстати, с таким безобразием я сталкивался в коде реального проекта. Пришлось сильно бить ногами программиста, любившего такое "обнуление".)

C++
1
2
3
    // для динамических массивов:
    char    *a1 = new char[10]();   // все элементы будут '\0'
    bool    *a2 = new bool[10]();   // все элементы будут false
Увы, это неверно. Не будут.
1
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;
}
0
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));
В целом понял, большое спасибо за ответы
0
Убежденный
Ушел с форума
Эксперт С++
15794 / 7231 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.09.2013, 16:27 #8
Цитата Сообщение от ___ Посмотреть сообщение
а что мешает проверить? у меня нули
По стандарту языка (С++03, 5.3.4, п.15), это справедливо только
для формы со скобочками, "new T[] ()" (new-initializer).
Если new-initializer отсутствует, объект создается неинициализированным.
0
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
12.09.2013, 16:50 #9
Цитата Сообщение от Убежденный Посмотреть сообщение
Если new-initializer отсутствует, объект создается неинициализированным.
все понятно

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

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

Добавлено через 38 секунд
многого не знаю и могу ошибаться
0
12.09.2013, 16:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 16:50
Привет! Вот еще темы с ответами:

Как в классе А у объекта класса B вызвать метод класса B ? - C++
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом же классе есть метод push() . Возможно ли в...

Указатель на метод класса в качестве аргумента метода класса - C++
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот потребовалось создать ХХХ в дополнительном классе. Вопрос: как...

Чем отличается шаблонный метод класса от шаблонного класса? - C++
Чем отличается шаблонный метод класса от шаблонного класса???????ПЛИЗ!!!!Если можно немного ссылок на летературу

Может ли метод класса возвращать экземпляр этого же класса? - C++
такой вопрос, реально что бы функция класса имела тип класса(возвращала класс), то есть типа так: class c1{ c1 f1(); } если да, то...


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

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

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