Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2011, 13:35   #31
Janym
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 22
По умолчанию

Цитата:
У меня есть подозрение. mingw неявный КК делает таким: MyClass(const MyClass &other). Студия делает КК таким: MyClass(MyClass other). Это объясняет, почему при func(other) вызывается 2 деструктора, а не один. Хотя по-моему это как-то рекурсивненько получается .

upd: ан нет, не бывает копирующих конструкторов MyClass(MyClass other), должна быть передача по ссылке. Иначе реально ведь рекурсия получится.
Это точно.
А студийный неявный КК работает грубо говоря так:
MyDelClass o;
MyBase3 t=o;
MyBase3 r=t;



Проверил в Студии твой код, результаты теже:
********************************
*** Gonna test another class ***
Constructor of Class1 0012FE83
*** I just created object at 0012FE83 and now copy will be created ***
--- Hello, I got copy of object at 0012FDA8 ---
Destructor of Class1 0012FDA8
** Bye-bye ***
Destructor of Class1 0012FE83
********************************
*** Gonna test another class ***
Constructor of Class2 0012FE83
*** I just created object at 0012FE83 and now copy will be created ***
Copy constructor of Class2 0012FD98
--- Hello, I got copy of object at 0012FD98 ---
Destructor of Class2 0012FD98
** Bye-bye ***
Destructor of Class2 0012FE83
********************************
*** Gonna test another class ***
Constructor of Class3 0012FE83
*** I just created object at 0012FE83 and now copy will be created ***
Copy constructor of Class3 0012FD98
--- Hello, I got copy of object at 0012FD98 ---
Destructor of Class3 0012FD98
** Bye-bye ***
Destructor of Class3 0012FE83
Press any key to continue . . .
Janym вне форума Ответить с цитированием
Старый 28.02.2011, 13:37   #32
Janym
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 22
По умолчанию

Если в моей проге в Funct аргумент поменять на MyBase1 или на MyBase2, то всё работает нормально. Видать такое поведение неявного КК только при множественном наследовании..
Janym вне форума Ответить с цитированием
Старый 28.02.2011, 15:17   #33
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Меня лично, больше всего удивило, что MyBase2 имеет адрес, отличный от остальных. Видимо действительно какой-то косяк с множественным наследованием?
netrino вне форума Ответить с цитированием
Старый 28.02.2011, 16:10   #34
Janym
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 22
По умолчанию

Я в начале тоже смутился, но потом подумал что так и должно быть ))
Janym вне форума Ответить с цитированием
Старый 28.02.2011, 16:20   #35
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Видимо действительно какой-то косяк с множественным наследованием?
у С++ в принципе с этим не ахти, хотя и работает.
в итоге получается что MyBase3 содержит внутри себя одновременно и MyBase2 и MyBase1
соответственно их создает. и соответственно разрушает.
Цитата:
Destr base3 0012FE73
Destr MyBase2 0012FE74
Destr MyBase1 0012FE73
что мы и видим.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.02.2011, 16:40   #36
Janym
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 22
По умолчанию

Завязываем с множественным и переходим на си-решотку ,)
Janym вне форума Ответить с цитированием
Старый 28.02.2011, 16:45   #37
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

шарп не панацея.

криворукость и там может сотворить страшное.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.02.2011, 16:51   #38
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
у С++ в принципе с этим не ахти, хотя и работает.
в итоге получается что MyBase3 содержит внутри себя одновременно и MyBase2 и MyBase1
соответственно их создает. и соответственно разрушает.
что мы и видим.
Ну я то понимаю, но ведь ни один из классов не содержит ни виртуальных таблиц ни переменных, потому, казалось бы, они все должны ссылаться на один адрес. В gcc, кстати, так и происходит. Ну да ладно, оставим это на совести разработчиков компиляторов.
netrino вне форума Ответить с цитированием
Старый 28.02.2011, 17:01   #39
Janym
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 22
По умолчанию

Разработчики как бы намекают, юзайте & или *
Janym вне форума Ответить с цитированием
Старый 28.02.2011, 18:46   #40
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Народ, покажите что тут скажет после VC'шного компилятора...
Код:
#include <iostream>
using namespace std;

class MyBase1
{
public:
    MyBase1() {
        cout << "Con1\t" << this << endl;
    }
    MyBase1(const MyBase1 &other) {
        cout << "CCon1\t" << this << endl;
    }
    ~MyBase1() {
        cout << "Des1\t" << this << endl;
    }
    
};

class MyBase2
{
public:
    MyBase2() {
        cout << "Con2\t" << this <<  endl;
    }
    MyBase2(const MyBase2 &other) {
        cout << "CCon2\t" << this << endl;
    }
    ~MyBase2() {
        cout << "Des2\t" << this << endl;
    }
};

class MyBase12 : public MyBase1, MyBase2
{
public:
    MyBase12() {
        cout << "Con12\t" << this <<  endl;
    }
    MyBase12(const MyBase12 &other) {
        cout << "CCon12\t" << this << endl;
    }
    ~MyBase12() {
        cout << "Des12\t" << this << endl;
    }
};

class MySuperClass : public MyBase12
{
public:
    MySuperClass() {
        cout << "ConS\t" << this << endl;
    }
    MySuperClass(const MySuperClass &other) {
        cout << "CConS\t" << this << endl;
    }
    ~MySuperClass() {
        cout << "DesS\t" << this << endl;
    }
};

void func(MyBase12 r)
{
    cout << "COPY:\t" << &r <<  endl;
}

int main()
{
    const char *delim = "*****************\n";
    MySuperClass o;
    cout << "ORIG:\t" << &o << endl << delim;
    func(o);
    cout << delim;
}
У меня после gcc так:
Код:
Con1    0x7fff30141e66
Con2    0x7fff30141e66
Con12   0x7fff30141e66
ConS    0x7fff30141e66
ORIG:   0x7fff30141e66
*****************
Con1    0x7fff30141e67
Con2    0x7fff30141e67
CCon12  0x7fff30141e67
COPY:   0x7fff30141e67
Des12   0x7fff30141e67
Des2    0x7fff30141e67
Des1    0x7fff30141e67
*****************
DesS    0x7fff30141e66
Des12   0x7fff30141e66
Des2    0x7fff30141e66
Des1    0x7fff30141e66
Вполне ожидаемо
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение свойств объекта не активируя его ndvikulov Microsoft Office Excel 16 16.09.2010 20:14
Передача метода объекта. the_deer_one Общие вопросы C/C++ 8 09.09.2010 15:07
Можно ли в макрос передать имя объекта, его вызывающего buagbu Microsoft Office Excel 3 16.04.2010 08:54
Передача объекта в функцию Юра_YUYU Общие вопросы C/C++ 14 18.01.2010 16:00
Проверка объекта после его уничтожения AHTuKiLLeR Общие вопросы Delphi 1 19.06.2009 10:43