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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Задачка http://www.cyberforum.ru/cpp-beginners/thread445171.html
Здравствуйте, есть задачка: "Вводится строка, потом вводится символ. Далее нужно в строке убрать все эти символы, и сместить строку на кол-во убранных символов" Так вот, проблема если написать больше 3 одинаковых символов подряд, 1 остаётся. Чем больше одинаковых символов, то их больше и остаётся. Прошу у вас помощи. int size = 20; char *str = new char;
C++ C++ as WebServer Всем привет. Накодил какого-то бреда на Си, который создаёт .htm файл с javascript'ом и canvas. Такой вот костыльный метод - влом было вспоминать WinAPI и тем более - изучать, как там рисуется всё в Linux'е (это явно OpenGL, а там плохо). Костыли костылями, но вот подумал - почему нельзя всё это завести на сервере, каким-то образом происходит запрос, мы создаём файлик, куда пихаем весь html... 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: '); readln(a); write('Введите B: '); readln(b);
C++ Рекурсия-Советы или Трюки
привет у меня скоро экзамен я хотел спросить как лучше всего отслеживать рекурсию или её запиывать или вообще любую функции,все советы хороши
C++ Находим сверхпростое число http://www.cyberforum.ru/cpp-beginners/thread445154.html
Пожалуйста помогите с проблемой. Никак не могу понять, что не так. Вообщем суть в том, что сверхпростое число - это не только простое число, но у этого простого числа индекс тоже простой. Например число 2 - простое, оно первое в списке простых чисел, но цыфра один - непростое. Значит это не сверхпростое число. Цыфра 3 - простое, и вторая в списке сверхпростых чисел, а двойка в свою очередь тоже...
C++ Бинарные файлы Есть 2 текстовых файла .В первом информации представлена в след виде:номер и ФИО,во втором номер Группы,и оценки по предметам.Так мне нужно присоединить фамилию из первого присоеденить к ведомости второго файла с формированием нового бин файла.я пока сделал только это: #include <iostream> #include <fstream> #include <string.h> using namespace std; struct studfam { int number; char fam;... подробнее

Показать сообщение отдельно
Red Planet
 Аватар для 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");
}
 
Текущее время: 22:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru