Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/22: Рейтинг темы: голосов - 22, средняя оценка - 5.00
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
1

Перегрузка new

25.02.2010, 07:30. Просмотров 3952. Ответов 17
Метки нет (Все метки)

Дайте примеры на перегрузку.
C++
1
2
3
4
#define n ... // Некая целая константа
class a { ... }; // Некий класс
a *p=new a; // Здесь должен быть вызван перегруженный оператор. Как его перегрузить и где?
a *p=new a[n]; // Здесь должен быть вызван перегруженный оператор. Как его перегрузить и где?
.

Добавлено через 1 час 44 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class a
{
 protected:
  void * operator new (size_t size) // Почему так нельзя?
  {
   a *p;
   p=(a *)malloc(size);
   return p;
  }  
 public:
  a()
  {
  }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2010, 07:30
Ответы с готовыми решениями:

Перегрузка в виде метода VS Перегрузка в виде функции друг
Привет! Собственно сабж: В каких случаях используется перегрузка в виде...

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры...

перегрузка []
Есть класс, и почему компилятор выдает ошибку на функции int &operator(int);...

Перегрузка ~
Все привет. Есть класс в котором перегружен оператор тильда,он должен...

Перегрузка в c++
Собственно для чего нужна перегрузка функций или операторов ?

17
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
25.02.2010, 07:54 2
Цитата Сообщение от taras atavin Посмотреть сообщение
Дайте примеры на перегрузку.
Долго думал зачем это вообще надо... не придумал.
Задача оператора new - выделять память.
Все остальное делается в конструкторе.
У class a{} как-то по-особому память выделяется, что-ли?
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
25.02.2010, 07:57  [ТС] 3
Память под экземпляры этого класса вообще не должна выделяться никуда, кроме его защищённых static-членов.
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
25.02.2010, 11:41 4
Цитата Сообщение от taras atavin Посмотреть сообщение
Память под экземпляры этого класса вообще не должна выделяться никуда, кроме его защищённых static-членов.
тем более...
задача из разряда brainfuck.
0
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,992
Завершенные тесты: 1
25.02.2010, 12:16 5
Patch, На самом деле перегрузка new и delete очень полезная штука для отладки программ, поиска утечек памяти.
Я перегружал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
inline void   operator delete(void* ptr)
 {
     free(ptr);
 }
 
 inline void   operator delete[](void* ptr)
 {
     free(ptr);
 }
 
      inline void * __cdecl operator new(unsigned int size,const char *file, int line)
      {   
          void *ptr = (void *)malloc(size);
          return(ptr);
      };
 
      inline void * __cdecl operator new [](unsigned int size,const char *file, int line)
      {   
          void *ptr = (void *)malloc(size);
          return(ptr);
      };
1
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
25.02.2010, 12:51  [ТС] 6
Спасибо. Это прямо в проге? А в классе нельзя? Мне надо закрыть создание динамических экземляров везде, кроме привэйт массива-члена со статик указателем.
0
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,992
Завершенные тесты: 1
25.02.2010, 12:54 7
Я кидал все в h файл, и его подключал ко всем файлам проекта.
Перегрузить для отдельного класса тоже походу можно примерно так же, но у меня такой необходимости не было, так что не знаю получится или нет, возможно компилятор не даст.
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
25.02.2010, 13:02 8
Цитата Сообщение от taras atavin Посмотреть сообщение
Память под экземпляры этого класса вообще не должна выделяться никуда, кроме его защищённых static-членов.
Вот как раз для этого и подойдет перегрузка new и delete:
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
#include <iostream>
using namespace std;
 
struct X
{
    X() {};
    ~X() {};
    static X* clone() { return new X; }
    static void destroy(X* obj) { delete obj; }
 
protected:
    void* operator new(size_t bytes) { return ::operator new(bytes); }
    void operator delete(void* p) { ::operator delete(p); }
};
 
int main()
{
  // это не скомпилируется:
  // X* px = new X;
  // delete px;
  
  // а вот это ок:
  X* px = X::clone();
  X::destroy(px);
 
  return 0;
}
Добавлено через 49 секунд
Ну и аналогично с new[] и delete[].
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
25.02.2010, 13:31 9
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Patch, На самом деле перегрузка new и delete очень полезная штука для отладки программ, поиска утечек памяти.
Пожалуй, в таком контексте - да.
Не приходило в голову ловить утечки таким способом.
Как-то сразу привык на любое выделение памяти сразу писать в деструкторе
C++
1
2
3
4
if(lpX){
 delete lpX;
lpX = 0;
}
уже на уровне рефлекса.

Ок, убедили. Может где-то кому-то и помочь.
0
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,992
Завершенные тесты: 1
25.02.2010, 13:38 10
Цитата Сообщение от Patch Посмотреть сообщение
Как-то сразу привык на любое выделение памяти сразу писать в деструкторе
Когда объектов много, они выделяются динамически, их заранее неизвестное число, и они могут в любой момент уничтожаться и создаваться, а так же разным образом друг с другом взаимодействовать, боюсь такое не прокатит...
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
25.02.2010, 13:48 11
Почему же не прокатит? Непосредственно в момент входа в тело деструктора (в тот самый момент, когда поток управления проходит открывающую скобку) объект уже считается "несуществующим" и должен освободить все захваченные ресурсы.
Другое дело, что в многопоточной программе один поток может уже начать выполнение деструктора, а другой, не подозревая об этом, попытаться использовать этот объект..... Но это уже - не проблемы языка как такового, а проблемы проектирования.
0
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,992
Завершенные тесты: 1
25.02.2010, 14:04 12
CheshireCat, Понятное дело, что это не проблема языка. Но как не проектируй, далеко не всегда можно свести к тому, что все объекты будут создаваться в конструкторе, а уничтожаться в деструкторе.
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
25.02.2010, 14:19 13
А каким еще образом они могут создаваться?
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
25.02.2010, 14:21 14
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Когда объектов много, они выделяются динамически, их заранее неизвестное число, и они могут в любой момент уничтожаться и создаваться, а так же разным образом друг с другом взаимодействовать, боюсь такое не прокатит...
Еще как прокатит.
Простые правила:
1)при создании указателя на объект всегда его обнуляй.
2)при удалении объекта - опять-же обнуляй его указатель.
Все.
Неважно, что когда, где, как, и в каких количествах ты делал с указателями на объекты,
в деструкторе проверяется не равны ли они нулю, и если нет - объекты удаляются.
1
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
25.02.2010, 14:25 15
На самом деле, можно и не проверять. delete NULL; (равно как и free(NULL); ) безопасно по Стандарту.
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
26.02.2010, 04:48  [ТС] 16
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Я кидал все в h файл, и его подключал ко всем файлам проекта.
Перегрузить для отдельного класса тоже походу можно примерно так же, но у меня такой необходимости не было, так что не знаю получится или нет, возможно компилятор не даст.
В public дал. Но мне в pulic не надо. Мне надо в private и в protected.

Добавлено через 3 минуты
Цитата Сообщение от CheshireCat Посмотреть сообщение
struct X { X() {}; ~X() {}; static X* clone() { return new X; } static void destroy(X* obj) { delete obj; } protected: void* operator new(size_t bytes) { return ::operator new(bytes); } void operator delete(void* p) { ::operator delete(p); } };
Это точно должно компилиться? У меня не получилось. Или я что-то не так делаю? Или "сайт для экспериментов с программами" и в этом плане отличается, например, от gcc?

Добавлено через 5 минут
Нашел причину. не фурычит, всё эйси.

Добавлено через 46 секунд
Цитата Сообщение от CheshireCat Посмотреть сообщение
На самом деле, можно и не проверять. delete NULL; (равно как и free(NULL); ) безопасно по Стандарту.
Я привык проверять. И нафиг мне освобождать несуществующую память по указателю в никуда?
0
insideone
Модератор
Автор FAQ
3659 / 939 / 112
Регистрация: 10.01.2010
Сообщений: 2,527
26.02.2010, 18:23 17
Цитата Сообщение от taras atavin Посмотреть сообщение
Я привык проверять. И нафиг мне освобождать несуществующую память по указателю в никуда?
Она как раз и безопасна тем что ничего освобождаться не будет, т.к. все сработает наподобии if ( p == NULL ) return;. Другими словами ваша проверка оказывается дублирующей) Хотя я понимаю, как то некомфортно Сам проверяю... тоже привычка

Цитата Сообщение от taras atavin Посмотреть сообщение
В public дал. Но мне в pulic не надо. Мне надо в private и в protected.
Мне кажется тут вариантов не так то много. Если вы пишите private то можете вызывать только в методах класса или в дружественных функциях\классах\... . Если protected то только в своих...
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
26.02.2010, 18:34 18
Цитата Сообщение от taras atavin Посмотреть сообщение
Мне надо в private и в protected
Для чего тебе это?
0
26.02.2010, 18:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2010, 18:34

С++. Перегрузка
Нужна помощь! Буду рада любым идеям! Надо написать программу, которая...

перегрузка
а чем отличаются перегрузка как метод и как функция?

перегрузка []
Как перегрузить operator так, чтобы когда я модифицировал массив то вызывалась...


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

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

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