Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в коде, При создании объекта класса 
:(
    Опции темы
Competitor
Дата 1.1.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: нет
Всего: -1



Подскажите, где ошибка?
Код

class Name1
{
public:
    Name1(int i) : _int(i){}    
    Name1(Name1 f) : _int(f._int){}
private:
    int _int;
};

Name1 ob1(123);
Name1 ob2(ob1);


PM MAIL WWW   Вверх
Partizan
Дата 1.1.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



не позволительны конструкторы типа ClassName(ClassName)
нужно использовать ClassName(const ClassName&), то есть в твоём конкретном случае нужно писать так :
Код

class Name1    
{    
public:    
    Name1(int i) : _int(i){}     
    Name1(Name1& f) : _int(f._int){}    
private:    
    int _int;    
};    
Name1 ob1(123);    
Name1 ob2(ob1);



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Partizan
Дата 1.1.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Но вообще говоря в твоём случае я бы использовал только конструктор Name1(int), просто передавал бы в ob2 ob1._int:
Код

Name ob2(ob1._int);



А такие конструкторы типа Name1(const Name1&) вообще используются для замещения конструктора копирования по умолчанию, который осуществляет всего навсего поверхностное копирование, создавая побитовую копию объекта, которая вряд ли будет пригодной, если в классе содержатся указатели или ссылки.


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Daevaorn
Дата 1.1.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Partizan @ 1.1.2006, 16:28)
который осуществляет всего навсего поверхностное копирование, создавая побитовую копию объекта, которая вряд ли будет пригодной, если в классе содержатся указатели или ссылки.

Первая часть этого предложения в корне не правильная. Не "поверхностное" или "побитовое"(хорошее слово!:)), а хорошее: с вызовом конструкторов копирования полей данного класса. А вот если среди полей указатели и ссылки, то конечно будут проблемы.
PM MAIL WWW   Вверх
Partizan
Дата 1.1.2006, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Это не я придумал...терминология такая... я лично всегда думал и продолжаю думать, что в С++ различают т.н. "поверхностное" и "глубинное" копирование данных. При "поверхностном"происходит передача только адреса от одной переменной к другой....в результате обе переменных указывают на одну и ту же область памяти...При т.н. "Глубинном" копировании происходит действительное копирование данных из одной области в другую...
Конструктор копирования по умолчанию производит поверхностное коепирование в вышеуказанном смысле... ещё раз говорю, что термины поверхностное и глубинное копирование придуманы не мной...



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Daevaorn
Дата 1.1.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Partizan
Я с терминологие не спорю. Просто называть "поверхностным", а уже тем более "побитовым" копирование, которое осуществляется через вызовы конструкторов копирования у объектов - это как то не хорошо.
PM MAIL WWW   Вверх
Partizan
Дата 1.1.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Ну хорошо...назовём это "буквальной" копией объекта...
Возможно я не слишком красиво ывразился, однако, думаю и вы, и, надеюсь, автор этой темы поняли о чём шла речь.
Имелось ввиду, что объекты побитово идентичны...

Это сообщение отредактировал(а) Partizan - 1.1.2006, 21:51


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
blackofe
Дата 4.1.2006, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(Partizan @ 1.1.2006, 21:39)
Ну хорошо...назовём это "буквальной" копией объекта...
Возможно я не слишком красиво ывразился, однако, думаю и вы, и, надеюсь, автор этой темы поняли о чём шла речь.
Имелось ввиду, что объекты побитово идентичны...

в том-то и дело, что нет. объекты будут побитово идентичны только в том случае, если у класса нет ни членов с определенными конструкторами, ни соответствующих базовых классов. так что в общем случае данное утверждение несправедливо, о чем и пытался сказать Daevaorn.
PM MAIL   Вверх
Partizan
Дата 4.1.2006, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Цитата(blackofe @ 4.1.2006, 00:18)
Цитата(Partizan @ 1.1.2006, )
Ну хорошо...назовём это "буквальной" копией объекта...
Возможно я не слишком красиво ывразился, однако, думаю и вы, и, надеюсь, автор этой темы поняли о чём шла речь.
Имелось ввиду, что объекты побитово идентичны...

в том-то и дело, что нет. объекты будут побитово идентичны только в том случае, если у класса нет ни членов с определенными конструкторами, ни соответствующих базовых классов. так что в общем случае данное утверждение несправедливо, о чем и пытался сказать Daevaorn.

smile blackofe,DaevaornТогда, если вас не затрудит, прошу привести примеры, демонстрирующие это...

Это сообщение отредактировал(а) Partizan - 4.1.2006, 00:40


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
blackofe
Дата 4.1.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(Partizan @ 4.1.2006, 00:32)
smile blackofe,DaevaornТогда, если вас не затрудит, прошу привести примеры, демонстрирующие это...

сначала выдержка из msdn:

A compiler-generated copy constructor sets up a new object and performs a memberwise copy of the contents of the object to be copied. If base class or member constructors exist, they are called; otherwise, bitwise copying is performed.

а вот пример:

Код

class A {
public:
    long an;
    A() : an(0)                                    {    cout << "A(), an: " << an << endl; }
    A(const long N) : an(N)                        {    cout << "A(N), an: " << an << endl; }
    A(const A &a)                                {    an = a.an*2;
                                                    cout << "copy A(), an: " << an << endl; }
    ~A()                                        {    cout << "~A(), an: " << an << endl; }
};

class B {
public:
    A a;
    B() : a(10) {}
};

int main()
{
    B b1;
    B b2(b1);

    cout << b1.a.an << endl;
    cout << b2.a.an << endl;

    return 0;
}


результат работы:

A(N), an: 10
copy A(), an: 20
10
20

~A(), an: 20
~A(), an: 10
Press any key to continue

если бы копирование было побитовое, то мы бы получили

10
10


но конструктор копии по умолчанию класса B (мы для него конструктор копии явно не описывали) вызвал конструктор копии класса A, тем самым увеличив значение an в два раза.

Это сообщение отредактировал(а) blackofe - 4.1.2006, 00:47
PM MAIL   Вверх
Partizan
Дата 4.1.2006, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



в том то и дело, что мы переопределили конструктор копирования....в том же посте речь шла о конструкторе копирования ПО УМОЛЧАНИЮ
Читаем внимательно:

Цитата

А такие конструкторы типа Name1(const Name1&) вообще используются для замещения конструктора копирования по умолчанию, который осуществляет всего навсего поверхностное копирование, создавая побитовую копию объекта, которая вряд ли будет пригодной, если в классе содержатся указатели или ссылки.


то бишь если видоизменить ваш пример следующим образом:
Код

class A {
public:
    long an;
    A() : an(0)                                    {    cout << "A(), an: " << an << endl; }
    A(const long N) : an(N)                        {    cout << "A(N), an: " << an << endl; }
//Убираем переопределённый конструктор копирования
//    A(const A &a)                                {    an = a.an*2;
//                                                    cout << "copy A(), an: " << an << endl; }
    ~A()                                        {    cout << "~A(), an: " << an << endl; }
};
class B {
public:
    A a;
    B() : a(10) {}
};
int main()
{
    B b1;
    B b2(b1);

    cout << b1.a.an << endl;
    cout << b2.a.an << endl;

    return 0;
}


то мы получаем:

A(N), an: 10
10
10
~A(), an: 10
~A(), an: 10
Press any key to continue

З.ы. ребят...читайте, пожалуйста, посты внимательнее...

Это сообщение отредактировал(а) Partizan - 4.1.2006, 01:00


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
blackofe
Дата 4.1.2006, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Partizan
тебе тоже не мешало бы читать посты внимательнее. вот этот код

Код

  B b2(b1);


вызывает конструктор копии класса B. мы для этого класса (class B) конструктор копии сами не создавали, уповая на конструктор копии, который создаст компилятор по умолчанию. он создал. но не побитовый, как бы ты хотел, а с вызовом соответствующих конструкторов для членов и для базовых классов. что мы и наблюдаем: конструктор копии по-умолчанию класса B не выполнил побитовое копирование объекта b1, а вызвал конструктор копии члена - объекта типа A. (для него мы написали конструктор копии, чтобы ты мог убедиться: да, конструктор копии по-умолчанию вызывает конструкторы членов и базовых классов, а не выполняет простое побитовое копирование).
PM MAIL   Вверх
Partizan
Дата 4.1.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Всё, спасибо...признаю...был неправ в той части, где говорил о побитовом копировании...
Но утверждение полностью верно в случае отсутствия каких бы то ни было конструкторов...

З.ы. поставил бы вам + за такой ценный урок....но не могу...постов не хватает...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
blackofe
Дата 4.1.2006, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Partizan, свои люди - сочтемся smile.
Добавлено @ 01:42
кстати, такое поведение конструктора копии по-умолчанию весьма ценно. во всяком случае, мы можем быть уверены, что если кто-то воспользуется нашим классом путем агрегирования или наследования, то, даже если он не определит конструктор копирования, компилятор это сделает за него и правильно вызовет наши конструкторы.

единственно, мы не застрахованы от того, что пользователь наших классов не напишет конструкторы копирования неправильно. ну, тут уж.. ;)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0626 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.