Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2013, 23:44   #11
Voipp
Пользователь
 
Регистрация: 03.08.2009
Сообщений: 32
Смущение

Цитата:
Сообщение от waleri Посмотреть сообщение
Через публичный статичный метод класса

Код:
class CObject
{
private:
  CObject();
public:
  static CObject* Factory() { return new CObject; }
};
через оператор new все равно не получится.

Вот условие задачи:
написать класс, такой, что
Код:
A a;                  // ошибка компилятора 
A *ap = new A;  // все окей
PS я все таки думаю надо через сокрытие конструктора и перегрузку оператора , но что-то не получается
Voipp вне форума Ответить с цитированием
Старый 28.06.2013, 00:06   #12
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Код:
class Test
{
private:
	Test();
public:
	void* operator new(unsigned int Size)
	{
		return new char[Size];
	}
	void Print()
	{
		cout << "TEST" << endl;
	}
};

int main()
{
	Test* test_2 = (Test*)Test::operator new(sizeof(Test));
	test_2->Print();
	system("PAUSE");
}
Вот так работает.

Почему вот так?
Код:
void* operator new(unsigned int Size)
{
      return new char[Size];
}
Просто когда я компилирую return new Test; то во время выполнения в этом операторе возникает исключение. Решил сделать так. Вроде работает.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 28.06.2013 в 00:14.
kineziz вне форума Ответить с цитированием
Старый 28.06.2013, 00:13   #13
Voipp
Пользователь
 
Регистрация: 03.08.2009
Сообщений: 32
Печаль

Цитата:
Сообщение от kineziz Посмотреть сообщение
Код:
class Test
{
private:
	Test();
public:
	void* operator new(unsigned int Size)
	{
		return new char[Size];
	}
	void Print()
	{
		cout << "TEST" << endl;
	}
};

int main()
{
	Test* test_2 = (Test*)Test::operator new(sizeof(Test));
	test_2->Print();
	system("PAUSE");
}
Вот так работает.

Почему вот так?
Код:
void* operator new(unsigned int Size)
{
      return new char[Size];
}
Просто когда я компилирую return new Test; то во время выполнения в этом операторе возникает исключение. Решил сделать так. Вроде работает.

А вот на счет того, чтобы заменить
Код:
Test* test_2 = (Test*)Test::operator new(sizeof(Test));
на

Код:
Test* test_2 = new Test;
может его сделать вне класса и потом объявить как friend?
я пробовал сделать его другом вне класса, но не в какую
Voipp вне форума Ответить с цитированием
Старый 28.06.2013, 00:21   #14
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

блин тогда я вообще без вариантов. Но мой вариант работает. Просто оператор new вызывает конструктор, это одно из отличий от malloc.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 28.06.2013, 09:06   #15
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от kineziz Посмотреть сообщение
Просто когда я компилирую return new Test; то во время выполнения в этом операторе возникает исключение.
Про рекурсию слышали?
В данном случае оператор new вызывает сам себя до бесконечности.
waleri вне форума Ответить с цитированием
Старый 28.06.2013, 15:40   #16
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

http://codepad.org/CdbkNzua
_Bers вне форума Ответить с цитированием
Старый 28.06.2013, 20:17   #17
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

не совсем понятно, с каких пор new вызывает конструктор. new память нарезает, а результат выполнения new передается в конструктор и доступен внутри конструктора через this.


Цитата:
Вот условие задачи:
написать класс, такой, что
Код:

A a; // ошибка компилятора
A *ap = new A; // все окей
а в чем разница между 1 и 2? в одном случае new&конструктор вызываются неявно, во втором случае явно. так что они либо оба будут работать, либо оба не будут.
f.hump вне форума Ответить с цитированием
Старый 28.06.2013, 20:20   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сделай деструктор приватным...
Тогда компилер тебе сам запретит... А в классе перегрузи delete - там и вызывай деструктор...
Вроде так... Хотя нужно пробовать на конкретном компилере...

У Мейерса в одной из книжек большая глава на эту тему написана...
Voipp, нарыл это.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.06.2013, 20:41   #19
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
а в чем разница между 1 и 2?
Разница в том, что можно было бы сделать объект, который можно создать в куче, но нельзя создать в стеке.
waleri вне форума Ответить с цитированием
Старый 28.06.2013, 21:25   #20
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
не совсем понятно, с каких пор new вызывает конструктор. new память нарезает, а результат выполнения new передается в конструктор и доступен внутри конструктора через this.
Ну просто объект создается в той области памяти, которую выделила new
И инициализируется указанным конструктором.
А вот как именно это происходит - это не суть важно. Это трудности компилятора.

Цитата:
Сообщение от f.hump Посмотреть сообщение
а в чем разница между 1 и 2? в одном случае new&конструктор вызываются неявно, во втором случае явно. так что они либо оба будут работать, либо оба не будут.
В первом случае объект создается на стеке, и new вообще не используется. Во втором - действует пользовательсткий аллокатор.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка оператора >> Sektr63 Общие вопросы C/C++ 5 19.11.2012 01:51
c# перегрузка оператора * world12_tk Помощь студентам 1 06.05.2012 01:04
перегрузка оператора ++ nhr Общие вопросы C/C++ 1 04.05.2011 23:32
Перегрузка оператора + Jane-sad Помощь студентам 0 05.10.2010 13:52
перегрузка оператора -> alex_alpha Общие вопросы C/C++ 5 23.06.2010 19:07