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

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

Восстановить пароль Регистрация
 
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,231
27.01.2016, 14:08     Placement new делигирование конструкторов #1
Вычитал, что до С++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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2016, 14:08     Placement new делигирование конструкторов
Посмотрите здесь:

Вызов конструкторов C++
C++ запуск конструкторов
C++ Конфликт конструкторов.
Наследование конструкторов C++
Наследование конструкторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
27.01.2016, 14:12     Placement new делигирование конструкторов #2
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Вычитал, что до С++11 и делигирования конструкторов использовали такой ход конём, но я слышал о вынесе void init(...) метода, который вызывается в каждом конструкторе, а тут такое на месте класса строим другой через placement new.
блин, несколько раз перечитал, не понял. Все слова вроде знакомы, а сут уловить не могу, точно так же было, когда английский только начинал учить
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,231
27.01.2016, 14:19  [ТС]     Placement new делигирование конструкторов #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 ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.01.2016, 14:19     Placement new делигирование конструкторов #4
rikimaru2013, юзать такое уж точно не стоит. Как минимум для корректности предварительно нужно вызвать деструктор у this (в данном случае не критично, я говорю в общем).
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
27.01.2016, 14:20     Placement new делигирование конструкторов #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.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11820 / 6799 / 769
Регистрация: 27.09.2012
Сообщений: 16,876
Записей в блоге: 2
Завершенные тесты: 1
27.01.2016, 14:21     Placement new делигирование конструкторов #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 велосипедить не нужно
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.01.2016, 14:24     Placement new делигирование конструкторов #7
Croessmah, Что значит не подойдет? Я что-то не вникаю чем вывод неожиданный? Тем что первый объект не уничтожается? Вызываем деструктор и готово. Но то, что использовать такое категорически не стоит - факт.
rikimaru2013
27.01.2016, 14:28  [ТС]
  #8

Не по теме:

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

Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
27.01.2016, 14:30     Placement new делигирование конструкторов #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Вызываем деструктор и готово
деструктор внутри конструктора это ж даже хуже, чем new(this)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2016, 14:35     Placement new делигирование конструкторов
Еще ссылки по теме:

Наследование конструкторов C++
C++ Наследование конструкторов
C++ New placement

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11820 / 6799 / 769
Регистрация: 27.09.2012
Сообщений: 16,876
Записей в блоге: 2
Завершенные тесты: 1
27.01.2016, 14:35     Placement new делигирование конструкторов #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Тем что первый объект не уничтожается?
Да.
Цитата Сообщение от ForEveR Посмотреть сообщение
Вызываем деструктор и готово.
Так у ТС этого не было.
Yandex
Объявления
27.01.2016, 14:35     Placement new делигирование конструкторов
Ответ Создать тему
Опции темы

Текущее время: 16:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru