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

Использование placement-new в перегруженном операторе присваивания - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Visual C++ Нужно переделать програму с С++ Builder XE4 в С++ visual http://www.cyberforum.ru/cpp/thread1456966.html
include <StrUtils.hpp> void __fastcall TForm1::Button1Click(TObject *Sender) { String s = ""; TStringDynArray arr(SplitString(Edit1->Text, " ")); for(int i = 0; i < arr.Length; i++) { s += String().sprintf(L"(%s) - длина: %d\n", arr, arr.Length()); }
C++ Помогите понять условие задачи: "Ввести текст с разделителями и отредактировать его" Всем доброго времени суток! Может конечно не в ту тему пишу, но всё же думаю вы мне поможете. Прислали задачку из книжки, попросили помочь. Сама задача: Ввести текст с клавиатуры, число строк которого заранее неизвестно, а также массив разделителей. Ввод текста прекращается, если введена строка, не содержащая ни одного символа из указанного пользователем набора. Переставить местами строки, в... http://www.cyberforum.ru/cpp/thread1456929.html
помагите ришить с++ задачи C++
1. Написать программу, которая удаляет из введенной с клавиатуры строки начальные пробелы. 2. Ввести фамилию, имя и отчество одной строкой. Определить длину каждого слова. Вывести фамилию в обратном порядке.
Ошибки SFML: unresolved external symbol SFML
Пишу курсовую работу типа платформер. Вроде ровно подключил sfml, но тем не менее вижу вот такие ошибки В чем может быть причина их возникновения?
C++ Нахождение несобственного интеграла http://www.cyberforum.ru/cpp/thread1456361.html
Стоит задача написать программу для нахождения несобственного интеграла. По сути поискав, я пришёл к выводу, что всё что требуется это написать эту формулу на языке с++ Может кто помочь с бесконечностью, не совсем понятно как её использовать. Либо может кто сможет перевести эту формулу. Заранее благодарен за помощь
C++ Из Паскаля в С++ 2: begin if (d=28) then begin m:=3; d:=1; end else if d<28 then inc(d); end; 4, 6, 9, 11: подробнее

Показать сообщение отдельно
FraidZZ
Модератор
 Аватар для FraidZZ
3886 / 1512 / 228
Регистрация: 06.01.2013
Сообщений: 4,035
Завершенные тесты: 1
25.05.2015, 00:01     Использование placement-new в перегруженном операторе присваивания
Всем хей.

Допустим, у меня определён конструктор копирования для класса T. Теперь я хочу перегрузить для T оператор присваивания и, чтобы не повторять код (DRY всё же), делаю так:

C++
1
2
3
4
5
T& operator = (const T& ref) {
  if (this != &ref)
     new(this) T(ref);
  return *this;
}
В целом - схема работает. Но мне хотелось бы узнать подводные камни.
Беглый осмотр в данном виде их не нашёл, утечек вроде не возникает, всё тишь да гладь...

Но не покидает ощущение, что так можно неплохо настрелять себе в ногу.
Подопытный кролик
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
46
47
48
49
50
51
52
#include <iostream>
 
class T {
    int *arr;
    size_t sz;
public:
    T( int st, int _sz) : sz(_sz), arr(new int[_sz]) {
        for (int i = 0; i < sz; ++i) arr[i] = i + st;
    }
    
    T(const T& ref) : sz(ref.sz), arr(new int[ref.sz]) {
        for (int i = 0; i < sz; ++i) arr[i] = ref.arr[i];
    }
    
    T( ) : sz(0), arr(nullptr) { }
    
    T& operator = (const T& ref) {
        if (this != &ref)       
            new(this) T(ref);
        return *this;
    }
    
    void print( ) {
        for (size_t i = 0; i < sz; ++i) std::cout << arr[i] << ' ';
        std::cout << std::endl;
    }
    
    ~T( ) {
        for (size_t i = 0; i < sz; ++i) arr[i] = 0;
        delete[] arr;
    }
};
 
int main ( ) {
    while (1) {
        T a(20, 30);
        T b(a);
        T c;
        c = b;
        T d;
        {
            T f(15, 10);
            d = f;
        }
        
        a.print();
        b.print();
        c.print();
        d.print();
    }
    return 0;
}


Естественно, реь идёт о тех случаях, когда от конструктора копирования и оператора присваивания требуется единообразное поведение.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 03:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru