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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2011, 16:25   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Восклицание Копирубщий конструктор

Столкнулся с проблемой копирующего конструктора, который по непонятным причинам не вызывается вот код(не обращайте внимания ни на что, кроме копирующего конструктора...)
Код:
#include <iostream>
#include <string>


class Base;
class Day;
class Person
{
  public:
    Person()
    {
       fullName = "No Name";
       nAge = 0;
       cout<<"Creating Person "<<fullName<<" "<<nAge<<endl;
    }
    Person(Person& p) : nAge(p.nAge), fullName(p.fullName)
    {
    }
    Person(int Age)
    {
       nAge = Age;
       fullName = "No Name";
    }
    Person(int Age,const char* nName)
    {
       nAge = Age;
       fullName = nName;
    }
    Person(short d,short m,short y,int Age,string fName)
    {
       nAge = Age;
       fullName = fName;
       dOfB = (unsigned short)d;
       mOfB = (unsigned short)m;
       yOfB = (unsigned short)y;
    }
    ~Person()  
    {
        cout<<"Destructor of Person "<<fullName<<" "<<nAge<<endl;
    }
    Person& operator=(const Person& p)
    {
       dOfB = p.dOfB;
       mOfB = p.mOfB;
       yOfB = p.yOfB;
       return *this;
    }
    friend bool CheckToday(Person&, Day&);
  protected:
    int nAge;  
    string fullName;
    unsigned short dOfB;
    unsigned short mOfB;
    unsigned short yOfB;
};

class Base
{
   public:
   Base(int n = 1) : pCount(n)
   {
        cout<<"Creating Base with pCount = "<<pCount<<endl;
        pArray = new Person[n];
   }
   Base(Base& b)  // Вот этот копирующий конструктор не вызывается
   {
        pCount = b.pCount;
        cout<<"Creating Copy of Base"<<endl;
        pArray = new Person[pCount];
        for (int i = 0;i<pCount;i++)
        {
  	     pArray[i] = b.pArray[i];
        }
   }
   ~Base()
   {

        delete[] pArray;
   }
   void AddPerson(Person&);
   protected:
   	int pCount;
   	Person* pArray;
};
И вот как я пытаюсь его вызвать:
Код:
#include <iostream>
#include <stdio>
#include "myClasses.cpp"
#pragma hdrstop

using namespace std;

Base* fn()
{
   Base* B = new Base(5);
   Base* A(B);
   return A;
}

int main(int argc, char* argv[])
{
        Base* g = fn();
        delete g;
        system("pause");
        return 0;
}
_-Re@l-_ вне форума Ответить с цитированием
Старый 19.03.2011, 17:54   #2
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

неправильно пытаешься.
Код:
Base* fn()
{
   Base* B = new Base(5);
   Base* A(B);
   return A;
}
Base* A(B); - это инициализация указателя A адресом B, а не создание нового объекта через вызов конструктора копий. твой код абсолютно идентичен коду:
Код:
Base *fn()
{
    return new Base(5);
}
вот вызов копирующего конструктора
Base *A = new Base(*B);
или
Base A(*B);

ну и если уж на то пошло, входящий параметр в копирующем конструкторе должен быть константным

ну а если пойти еще дальше, то ты будешь иметь мемори лик, если хочешь тут использовать копирующий конструктор
Код:
Base* fn()
{
   Base* B = new Base(5);
   Base* A = new Base(*B);
   return A;
}
A освободишь ты позже, а B нет

видимо ты пишешь на borland c++ 3.1, который "в некоторой степени поддерживает с++"
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 19.03.2011 в 18:02.
pproger вне форума Ответить с цитированием
Старый 19.03.2011, 17:59   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
ну и если уж на то пошло, входящий параметр в копирующем конструкторе должен быть константным
Это я знаю, просто именно в этом коде я не сильно насчёт этого заморачивался.
Цитата:
вот вызов копирующего конструктора
Base *A = new Base(*B);
или
Base A(*B);
А вот за это спасибо.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
конструктор _ILYA_ Visual C++ 2 14.10.2010 01:38
С++ (конструктор, деструктор, копирующий конструктор) Jane-sad Помощь студентам 2 01.10.2010 10:01
Конструктор Farrel Общие вопросы C/C++ 1 30.09.2010 01:18
конструктор An123 Помощь студентам 1 17.01.2010 17:14
Конструктор PilGrim Общие вопросы C/C++ 0 16.01.2009 10:21