Насильный вызов конструктора
От: *this  
Дата: 17.11.02 20:31
Оценка:
Возможно ли такое?
Re: Насильный вызов конструктора
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 17.11.02 21:56
Оценка:
Здравствуйте, *this, Вы писали:

*>Возможно ли такое?

В принципе — да. Например, при placement new:


MyClass mc;

new (&mc) MyClass();
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Насильный вызов конструктора
От: RmzVoid Россия  
Дата: 17.11.02 21:58
Оценка:
Здравствуйте, *this, Вы писали:

*>Возможно ли такое?

Конечно возможно



#include <math.h>

class Dummy
{
private:
    double v;
public:
    Dummy() { v=0; }
    Dummy(int value) { v=(double)value; }
    Dummy(char *str_value) { v=atof(str_value); }
};

int main()
{
    Dummy v = Dummy::Dummy("67");
    Dummy *t = &(Dummy::Dummy(2));
    return 0;
}
Re: Насильный вызов конструктора
От: GarikTot  
Дата: 17.11.02 23:36
Оценка:
Здравствуйте, *this, Вы писали:

*>Возможно ли такое?

Конечно:

class TMatrix
{
  // ...
}
//...
class TVector
{
  // ...
  TVector(int x, int y);
  TVector& operator=(const TVector &);
  TVector operator*(const TMatrix &);
}
// ...
TVector V = TVector(0, 0)*M; // создаётся вектор и умножается на матрицу
Re[2]: Насильный вызов конструктора
От: IT Россия linq2db.com
Дата: 18.11.02 04:08
Оценка:
Здравствуйте, GarikTot, Вы писали:

*>>Возможно ли такое?

GT>Конечно:


Я не уверен, что это тот самый вариант. В данном случае создаётся временная переменная (естественно для неё вызывается конструктор), потом вызывается конструктор копирования.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Насильный вызов конструктора
От: IT Россия linq2db.com
Дата: 18.11.02 04:08
Оценка:
Здравствуйте, *this, Вы писали:

*>Возможно ли такое?

А что собственно нужно?
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Насильный вызов конструктора
От: Алекс Россия http://wise-orm.com
Дата: 18.11.02 05:28
Оценка:
Здравствуйте, RmzVoid, Вы писали:

[]

RV>int main()

RV>{
RV> Dummy v = Dummy::Dummy("67");
RV> Dummy *t = &(Dummy::Dummy(2));
RV> return 0;
RV>}

RV>[/ccode]


Как мне когда-то Тарасевич объяснял, создание (семантика содания) временного объекта не есть вызов конструктора. К тому же нет никакого смысла получать адрес временного объекта, т.к. сразу же после интсрукции
Dummy *t = &(Dummy::Dummy(2));

он будет уничтожен. Я не знаток стандарта, но то, что VC 6.0 это компилирует, не означает, что можно так писать. Точно знаю, что VC 6.0 позволяет инициализировать не константные ссылки временными объектами. Типа:

Dummy& t = *(&Dummy());
Re[3]: Насильный вызов конструктора
От: RmzVoid Россия  
Дата: 18.11.02 05:53
Оценка: 18 (1) -1
Здравствуйте, Алекс, Вы писали:

А>он будет уничтожен. <Я не знаток стандарта>


А вот и не будет! в дебаггере смотрел!
Re[4]: Насильный вызов конструктора
От: Алекс Россия http://wise-orm.com
Дата: 18.11.02 05:55
Оценка:
Здравствуйте, RmzVoid, Вы писали:

хъ

RV>А вот и не будет! в дебаггере смотрел!


А как ты смотрел и каким компилятором пользуешься?
Re[2]: Насильный вызов конструктора
От: *this  
Дата: 18.11.02 15:45
Оценка:
*>>Возможно ли такое?

Здравствуйте, IT, Вы писали:

IT>А что собственно нужно?


ps: То что было предложенно выше скорей анонимные указатели

похоже что конструктор можно вызвать только если перегрузить new (.) — теперь появилась другая проблема:

я выделяю из пула некую структуру

struct node {

// ... данные

void *new (size_t bytes, Pool *pool) { ... }

void delete (void *ptr, Pool *pool) { ... }

}


— просто выделенные данные мне нужно заранее инициализировать конструктором

и почему-то когда я вызываю

n = new(&Pool) node; — все работает
delete (n, &Pool): — вызывает стандартный delete из CRT !!!

В ЧЕМ МОЖЕТ БЫТЬ ПРОБЛЕМА????

Спасибо.
Re[4]: Насильный вызов конструктора
От: Андрей Тарасевич Беларусь  
Дата: 18.11.02 22:23
Оценка:
Здравствуйте, RmzVoid, Вы писали:

А>>он будет уничтожен. <Я не знаток стандарта>


RV>А вот и не будет! в дебаггере смотрел!


Во-первых — будет. Будет уничтожен в конце вычисления выражения. Невнимательно, значит, смотрел.
Во-вторых, как тут уже не раз говорилось, применение встроенного унарного оператора '&' (взятие адреса) ко временному объекту в С++ запрещено.
Best regards,
Андрей Тарасевич
Re[3]: Насильный вызов конструктора
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 19.11.02 01:57
Оценка:
Здравствуйте, *this, Вы писали:

{ избыточное цитирование удалено модератором -- ПК }

*>n = new(&Pool) node; — все работает
*>delete (n, &Pool): — вызывает стандартный delete из CRT !!!

*>В ЧЕМ МОЖЕТ БЫТЬ ПРОБЛЕМА????

placement delete вызывается только при исключении, выброшенном при выполнении placement new (во всяком случае, стандарт говорит о таком применении). Непосредственно вызвать placement delete нельзя, хотя определить можно. Соответственно, синтаксиса для placement delete — нету.

В данном случае delete (n, &Pool) фактически пытается удалить Pool, трактуя (n,&Pool) как выражение, значением которого является вполне законный аргумент оператора delete, т.е., &Pool.

На самом деле, тебе нужно определить ещё один оператор delete в структуре node:

struct node {
...
void operator delete(void *ptr)
{
  // здесь нужно найти тот Pool, который содержит ptr и ему уже передать ptr для обработки
}
...
};

// Собственно, использование:

n = new(&Pool) node;
delete n; // Здесь вызовется node::delete
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[5]: Насильный вызов конструктора
От: RmzVoid Россия  
Дата: 19.11.02 02:56
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Во-первых — будет. Будет уничтожен в конце вычисления выражения. Невнимательно, значит, смотрел.

АТ>Во-вторых, как тут уже не раз говорилось, применение встроенного унарного оператора '&' (взятие адреса) ко временному объекту в С++ запрещено.

Компилятор не ругается! Запрещено возвращение адреса локальной переменной.
А указатель в моем примере будет верен до выхода из блока.
В данном случае функции мэйн...
Re[6]: Насильный вызов конструктора
От: Андрей Тарасевич Беларусь  
Дата: 19.11.02 03:17
Оценка: 14 (3)
Здравствуйте, RmzVoid, Вы писали:

АТ>>Во-первых — будет. Будет уничтожен в конце вычисления выражения. Невнимательно, значит, смотрел.

АТ>>Во-вторых, как тут уже не раз говорилось, применение встроенного унарного оператора '&' (взятие адреса) ко временному объекту в С++ запрещено.

RV>Компилятор не ругается!


Вот такой у тебя кривой компилятор.

RV>Запрещено возвращение адреса локальной переменной.


Нет, возвращение адреса локальной переменной на уровне диагностики компилятора как раз таки не запрещено. Это, разумеется, не корректно, но в общем случае и не детектируемо на стадии компиляции. В любом случае, у данному вопросу это не относится.

RV>А указатель в моем примере будет верен до выхода из блока.


Нет. То, что ты говоришь, похоже на правило продления жизни временного объекта при привязке к нему константной ссылки. Но это из несколько иной оперы, а для нашего случая еще раз повторяю: применение встроенного унарного оператора '&' (взятие адреса) ко временному объекту в С++ запрещено. Временные объекты не являются Lvalue, а встроенный унарный оператор '&', по определению, применим только к Lvalue.

Компилятор MSVC++ 6, например, позволяет применять '&' к временным объектам. Но о продении времени жизни объекта до конца блока он при этом не заботится. Объект уничтожается в конце вычисления полного выражения, а указатель остается "подвешенным". В любом случае — это довольно бесполезная вольность MSVC++ 6, никакого отношения к С++ не имеющая.
Best regards,
Андрей Тарасевич
Re[7]: Насильный вызов конструктора
От: RmzVoid Россия  
Дата: 19.11.02 04:45
Оценка:
Здравствуйте, Андрей Тарасевич:

Окей! Убедил
Все равно мне параллельно пока на эти вещи, таким углубленным С++
я не занимался, только в книжках читал. Да я думаю мне навряд ли
придется использовать такие тонкости.
Re[8]: Наивный :)
От: jazzer Россия Skype: enerjazzer
Дата: 19.11.02 07:39
Оценка:
Здравствуйте, RmzVoid, Вы писали:

RV>Здравствуйте, Андрей Тарасевич:


RV>Окей! Убедил :))

RV>Все равно мне параллельно пока на эти вещи, таким углубленным С++
RV>я не занимался, только в книжках читал. Да я думаю мне навряд ли
RV>придется использовать такие тонкости.

Вот словишь access violation или segmentation fault при очередно взятии адреса временой переменной — придется в книжки лезть...

Лучше сейчас С++ учи :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[9]: Наивный :)
От: RmzVoid Россия  
Дата: 21.11.02 06:59
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Вот словишь access violation или segmentation fault при очередно взятии адреса временой переменной — придется в книжки лезть...


J>Лучше сейчас С++ учи


Будь спок: на акцесс я реагирую адекватно...
Re[4]: От модератора форума C++
От: Павел Кузнецов  
Дата: 21.11.02 16:06
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

<...>

Пожалуйста, не забывай удалять лишнее из цитат
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.