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

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

Войти
Регистрация
Восстановить пароль
 
rikimaru2013
C++ Game Dev
2436 / 1130 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
#1

Placement new делигирование конструкторов - C++

27.01.2016, 14:08. Просмотров 228. Ответов 9
Метки нет (Все метки)

Вычитал, что до С++11 и делигирования конструкторов использовали такой ход конём, но я слышал о вынесе void init(...) метода, который вызывается в каждом конструкторе, а тут такое на месте класса строим другой через placement new.

Тут есть подводные камни?

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
#include <iostream>
using namespace std;
 
class Foo
{
 
public:
    int _x;
    int _y;
    Foo()
    {
        cout << "Foo()" << endl;
        new (this) Foo( 17, 19 );
    }
    Foo( const int x, const int y ) : _x(x), _y(y)
    {
        cout << "Foo( const int x, const int y )" << endl;
    }
};
int main()
{
    Foo a;
    cout << "Foo: "<< a._x << " " <<  a._y << endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2016, 14:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Placement new делигирование конструкторов (C++):

New placement - C++
Что это за юмор такой? #include &lt;iostream&gt; #include &lt;new&gt; using namespace std; int main() { double *a= new...

Использование placement-new в перегруженном операторе присваивания - C++
Всем хей. Допустим, у меня определён конструктор копирования для класса T. Теперь я хочу перегрузить для T оператор присваивания и,...

Union, new placement, strict-aliasing, cross-platform - C++
Доброго времени суток. Ниже представленный код вроде бы работает. Гонял его на компиляторах cl/mingw ...

Вызов конструкторов - C++
привет почему здесь вызывается только 1 конструктор? #include &lt;iostream&gt; using namespace std; class A {

Наследование конструкторов - C++
Здравствуйте, мне нужно что бы player наследовал конструктор от aobject class aobject { public: aobject(int xx,int yy,int** mm)...

Перегрузка конструкторов - C++
Добрый день знатоки С++ возник вопрос Код этой программы компилируется в CodeBlocks а на VirtualBox не компилируется , объясните...

9
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
27.01.2016, 14:12 #2
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Вычитал, что до С++11 и делигирования конструкторов использовали такой ход конём, но я слышал о вынесе void init(...) метода, который вызывается в каждом конструкторе, а тут такое на месте класса строим другой через placement new.
блин, несколько раз перечитал, не понял. Все слова вроде знакомы, а сут уловить не могу, точно так же было, когда английский только начинал учить
1
rikimaru2013
C++ Game Dev
2436 / 1130 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
27.01.2016, 14:19  [ТС] #3
Kastaneda, Before C++11 wasn't possible to delegate construction of class by another one of constructor. As i know, programmers use some inline method that was responsible for class initialization (like void init(17, "Ivanov", eSex::Male);).

Is it possible to do same with placement new called in default constructor to build class placed on memory of current already built class ?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.01.2016, 14:19 #4
rikimaru2013, юзать такое уж точно не стоит. Как минимум для корректности предварительно нужно вызвать деструктор у this (в данном случае не критично, я говорю в общем).
1
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
27.01.2016, 14:20 #5
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Тут есть подводные камни?
Это UB, конструирование объекта уже начато и ты вызываешь еще один конструктор во время конструирования.
Ссылка по теме, оттуда
BTW do NOT try to achieve this via placement new. Some people think they can say new(this) Foo(x, int(x)+7) within the body of Foo::Foo(char). However that is bad, bad, bad. Please don’t write me and tell me that it seems to work on your particular version of your particular compiler; it’s bad. Constructors do a bunch of little magical things behind the scenes, but that bad technique steps on those partially constructed bits. Just say no.
3
Croessmah
Эксперт CЭксперт С++
13416 / 7570 / 855
Регистрация: 27.09.2012
Сообщений: 18,639
Записей в блоге: 3
Завершенные тесты: 1
27.01.2016, 14:21 #6
Для non-POD типов не подойдет точно:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//Title of this code
//g++  4.9.2
 
#include <iostream>
using namespace std;
 
 
struct Test
{
    Test(int x=0) : x_(x) { std::cout << "ctor" << std::endl; }
    Test& operator=(const Test& src ) { x_ = src.x_; std::cout << "assign" << std::endl; return *this; }
    Test(const Test& src ) :x_(src.x_) {std::cout << "cctor" << std::endl;}
    ~Test(){std::cout << "dctor" << std::endl;}
    int x_ ;
};
 
 
 
std::ostream& operator<<(std::ostream& stream, const Test& obj)
{
    return stream << obj.x_ ;
}
 
 
class Foo
{
 
public:
    int _x;
    Test _y;
    Foo()
    {
        cout << "Foo()" << endl;
        new (this) Foo( 17, 19 );
    }
    Foo( const int x, const int y ) : _x(x), _y(y)
    {
        cout << "Foo( const int x, const int y )" << endl;
    }
};
int main()
{
    Foo a;
    cout << "Foo: "<< a._x << " " <<  a._y << endl;
}
http://rextester.com/XRXX30905

но я слышал о вынесе void init(...) метода, который вызывается в каждом конструкторе
Угу, только теперь же можно делегировать работу другому конструктору:
C++
1
Foo():Foo( 17, 19 )
так что init велосипедить не нужно
1
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.01.2016, 14:24 #7
Croessmah, Что значит не подойдет? Я что-то не вникаю чем вывод неожиданный? Тем что первый объект не уничтожается? Вызываем деструктор и готово. Но то, что использовать такое категорически не стоит - факт.
0
rikimaru2013
27.01.2016, 14:28  [ТС]
  #8

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
теперь же можно делегировать
В первом же посте есть эта информация и тема про "Лучшее решение делигирования конструкторов в С++9х"

0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
27.01.2016, 14:30 #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Вызываем деструктор и готово
деструктор внутри конструктора это ж даже хуже, чем new(this)
0
Croessmah
Эксперт CЭксперт С++
13416 / 7570 / 855
Регистрация: 27.09.2012
Сообщений: 18,639
Записей в блоге: 3
Завершенные тесты: 1
27.01.2016, 14:35 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Тем что первый объект не уничтожается?
Да.
Цитата Сообщение от ForEveR Посмотреть сообщение
Вызываем деструктор и готово.
Так у ТС этого не было.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2016, 14:35
Привет! Вот еще темы с ответами:

Наследование конструкторов - C++
Добрый день. Подскажите как правильно осуществить наследование конструктора в двух файлах h и cpp. В одном h файле все работало. ...

Наследование конструкторов - C++
Здравствуйте! У меня такой вопрос: Как сделать так, чтобы при создании объекта дочернего класса не вызывался конструктор родительского? При...

Наследование конструкторов - C++
если при наследовании классов отсутствует конструктор в базовом классе, то что тогда? Помогите, не могу найти ответ в инете.

Наследование конструкторов - C++
Вопрос по теории наследования: Есть некоторый базовый класс с двумя конструкторами типа паблик, первый без аргумента, второй с одним...


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
27.01.2016, 14:35
Ответ Создать тему
Опции темы

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