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

"Повторная" инициализация объекта - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Задачка http://www.cyberforum.ru/cpp-beginners/thread445171.html
Здравствуйте, есть задачка: "Вводится строка, потом вводится символ. Далее нужно в строке убрать все эти символы, и сместить строку на кол-во убранных символов" Так вот, проблема если написать...
C++ C++ as WebServer Всем привет. Накодил какого-то бреда на Си, который создаёт .htm файл с javascript'ом и canvas. Такой вот костыльный метод - влом было вспоминать WinAPI и тем более - изучать, как там рисуется всё... http://www.cyberforum.ru/cpp-beginners/thread445168.html
переведите с Паскаля на си++ пожалуйста! C++
в Паскале получается...а в СИ++ нет( procedure Mean(x,y:real; var AMean,GMean:real); begin AMean:=(x+y)/2; GMean:=sqrt(x * y); end; var a,b,c,d,am,gm:real; begin write('Введите A: ');...
C++ Рекурсия-Советы или Трюки
привет у меня скоро экзамен я хотел спросить как лучше всего отслеживать рекурсию или её запиывать или вообще любую функции,все советы хороши
C++ Находим сверхпростое число http://www.cyberforum.ru/cpp-beginners/thread445154.html
Пожалуйста помогите с проблемой. Никак не могу понять, что не так. Вообщем суть в том, что сверхпростое число - это не только простое число, но у этого простого числа индекс тоже простой. Например...
C++ Бинарные файлы Есть 2 текстовых файла .В первом информации представлена в след виде:номер и ФИО,во втором номер Группы,и оценки по предметам.Так мне нужно присоединить фамилию из первого присоеденить к ведомости... подробнее

Показать сообщение отдельно
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
25.02.2012, 21:57  [ТС]
Я не знал о временном объекте, который создается перед инициализацией и присваиванием. Действительно, написание операторов все логично объясняет. Операторы взяты со Страуструпа.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
A::A(const A &right) {
    p = new A;
    *p = *(right.p);
    x = right.x;
    y = right.y;
}
 
A& A::operator =(const A &right) {
    if (&right != this) {
        delete p;
        p = new int;
        *p = *(right.p);
        x = right.x;
        y = right.y;
    }
    return *this;
}
Надо будет только поразбираться с возвращаемыми значениями A& и A. Там у него не одна страница про это написано, но это завтра.

Следующее. Что скажете насчет такого кода? Все ли правильно?

Смысл такой. При сложении двух объектов сумма должна "знать" правого операнда. Поэтому заведен указатель *p, который проявляется только при сложении, в остальных случаях он никуда не указывает. Приведенный код работает, однако меня смущает то, что два указателя ссылаются на одно и тоже значение. См. оператор сложения, в нем строка

C++
1
p = right.p;
При применении

C++
1
2
A a4 = a3;
A a5 = a3;
еще два объекта, у которых есть указатель, ссылающихся на тот же объект - правый операнд того самого сложения.

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <vcl>
#include <iostream>
#include <list>
#pragma hdrstop
 
using namespace std;
 
class A {
    int x, y; A *p;
 
    public:
        A(int xx, int yy, A *p);
 
        A(int xx = -1, int yy = -1) :
            x(xx), y(yy), p(0) {}
 
        A& operator =(const A&);
        A operator +(const A&);
        bool operator ==(const A&);
        void show();
 
        A get_p_value() const { return *p; }
};
 
void A::show() {
    if (p != 0)
        cout << x << " " << y << " Right was: " << p->x << " " << p->y << endl;
    else
        cout << x << " " << y << " Right was: unknown" << endl;
}
 
A::A(int xx, int yy, A *pp) {
    x = xx;
    y = yy;
    p = pp;
}
 
A& A::operator =(const A& right) {
    if (this != &right) {
        p = right.p;
        x = right.x;
        y = right.y;
    }
    return *this;
}
 
A A::operator +(const A &right) {
    return A(x + right.x, y + right.y, const_cast<A*>(&right));
}
 
bool A::operator ==(const A &right) {
    return x == right.x && y == right.y && p == right.p;
}
 
#pragma argsused // No warning if function args are not in use.
// But there is no warning while compiling project. Why?
int _tmain(int argc, _TCHAR* argv[]) {
    list<A> lst = list<A>();
    A a1 = A(10, 10), a2(5, 7), a3;
    lst.push_back(a1);
    lst.push_back(a2);
 
    cout << "List before processing" << endl;
    for (list<A>::iterator it = lst.begin(); it != lst.end(); it++)
        it->show();
 
    a3 = a1 + a2;
    lst.remove(a3.get_p_value());
 
    cout << endl << "List after processing" << endl;
    for (list<A>::iterator it = lst.begin(); it != lst.end(); it++)
        it->show();
 
    system("pause");
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru