Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
1

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

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

Author24 — интернет-сервис помощи студентам
Всем привет.
Программируя на досуге столкнулся с таким вопросом - "обнуление полей класса". Ну первое что пришло в голову это создание отдельного метода например 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2013, 15:35
Ответы с готовыми решениями:

Много циклов. Не тяжко системе? Может есть более практичный вариант
Есть массивы. В них происходит запись названий определенных файлов. Так же есть List который...

Как метод класса возвращает обьект, который является одним из полей данного класса?
Привет! Когда я пытался изменять объект который вернул мне метод класса, полем или свойством...

Получить коллекцию полей класса? (более глобальный вопр ос)
Для практики я хочу сделать игру, но не могу додумать, как же правильно инициализировать поля...

Значение полей класса через метод и конструктор
Добрый день! Есть задача Сделал класс через конструктор, аргументы прописаны заранее....

8
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
12.09.2013, 15:41 2
Цитата Сообщение от stawerfar Посмотреть сообщение
memset(this,0,*this);
*this - это разве размер класса?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
12.09.2013, 15:48 3
Цитата Сообщение от stawerfar Посмотреть сообщение
каковы плюсы и минусы такого подхода. И есть какие подводные камни в моем подходе?
Минус в том, что не все может быть затерто нулем.
Например, попробуйте затереть какой-нибудь std::vector, если он член класса.
Или если класс содержит виртуальную таблицу, она тоже может быть затерта.
В итоге получите segmentation fault.
2
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
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
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
12.09.2013, 15:59 5
Минусов в таком подходе - ой-ей-ей! Как правильно написал коллега Убежденный, запросто можете получить segfault. (Кстати, с таким безобразием я сталкивался в коде реального проекта. Пришлось сильно бить ногами программиста, любившего такое "обнуление".)

C++
1
2
3
    // для динамических массивов:
    char    *a1 = new char[10]();   // все элементы будут '\0'
    bool    *a2 = new bool[10]();   // все элементы будут false
Увы, это неверно. Не будут.
1
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
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
150 / 64 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
12.09.2013, 16:06  [ТС] 7
Цитата Сообщение от castaway Посмотреть сообщение
*this - это разве размер класса?
нуда опечатка забыл в sizeof(*this) засунуть
C++
1
memset(this,0,sizeof(*this));
В целом понял, большое спасибо за ответы
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
12.09.2013, 16:27 8
Цитата Сообщение от ___ Посмотреть сообщение
а что мешает проверить? у меня нули
По стандарту языка (С++03, 5.3.4, п.15), это справедливо только
для формы со скобочками, "new T[] ()" (new-initializer).
Если new-initializer отсутствует, объект создается неинициализированным.
0
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
12.09.2013, 16:50 9
Цитата Сообщение от Убежденный Посмотреть сообщение
Если new-initializer отсутствует, объект создается неинициализированным.
все понятно

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

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

Добавлено через 38 секунд
многого не знаю и могу ошибаться
0
12.09.2013, 16:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.09.2013, 16:50
Помогаю со студенческими работами здесь

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

Как вызвать определенный метод переданного класса через метод другого класса?
Добрый день. Захотел я вызвать в методе класса метод некоего другого класса, о котором я пока не...

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

Вывод в DataGridView полей некоторого экземпляра класса, в котором одно из полей является списком List
Здравствуйте, помогите плиз!!! Возникла потребность вывода в DataGridView полей некоторого...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru