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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2011, 16:34   #1
Anubys
Форумчанин
 
Регистрация: 08.05.2010
Сообщений: 177
По умолчанию Не работает конструктор копирования

У меня не хочет работать конструктор копирования подскажите где ошибка

Код:
//---------------------------------------------------------------------------
#include <iostream>
#include <fstream>
#include <vcl>
#include <conio>
#include <iomanip>
#pragma hdrstop

//---------------------------------------------------------------------------
class Flower
{
        private:
           int *Number_of_petals;
           int total;
           int position;
        protected:
           string *color;
           string *month;
        public:
           string *title;

           Flower()
           {
               title            = new string[10];
               color            = new string[10];
               month            = new string[10];
               Number_of_petals = new int[10];
               total            = 10;
               position         = 0;
           }

           Flower(int n)
           {
               title            = new string[n];
               color            = new string[n];
               month            = new string[n];
               Number_of_petals = new int[n];
               total            = n;
               position         = 0;
           }
           ~Flower()
           {
                delete[] title;
                delete[] color;
                delete[] month;
                delete[] Number_of_petals;
           }

           Flower(const Flower& a)
           {
               title            = new string[10];
               color            = new string[10];
               month            = new string[10];
               Number_of_petals = new int[10];

                for(int i = 0;Number_of_petals[i] != NULL;i++)
                {
                        title[i] = a.title[i];
                        color[i] = a.color[i];
                        month[i] = a.month[i];
                        Number_of_petals[i] = a.Number_of_petals[i];

                }
           }

           void ShowFlowers();
           // Ініціалізація через клавіатуру користувача
           void EnterFlowers();
           // Ініціалізація полів через файл
           void EnterFlowersFromFile();
           void SetMonth(){cout << month << "\n";}
           void SetMonth(string mon){month[position] = mon;position++;}

};


void Flower::ShowFlowers()
{
        clrscr();
        for(int i = 0;i < position;i++)
                cout << title[i] << "\t" <<  Number_of_petals[i] << "\t" << color[i] << "\t" << month[i] << endl;
}

void Flower::EnterFlowers()
{
        string title1,color1,month1;
        int Number_of_petals1;
        string temp;

        for(int i = 0;i == 0;)
        {
                clrscr();

                cout << "Enter please Title Number_of_petals Color Month" << endl;
                cin >> title1;
                cin >> Number_of_petals1;
                cin >> color1;
                cin >> month1;

                title[position]             = title1;
                Number_of_petals[position]  = Number_of_petals1;
                color[position]             = color1;
                if(month1 == "1")
                {
                        SetMonth();
                }else
                        {
                           SetMonth(month1);
                        }
                cout << "Continue?(y/n)" <<"\n";
                cin >> temp;

                if(temp == "y")
                {
                        i = 0;
                }else
                        {
                                i = 1;
                        }
        }

        ShowFlowers();
}

void Flower::EnterFlowersFromFile()
{
        ifstream file("Flowers.txt");

        while(!file.eof())
        {
                file >> title[position] >> Number_of_petals[position]
                     >> color[position] >> month[position];

                position++;
        }

        ShowFlowers();
}


int main(int argc, char* argv[])
{
        Flower ob,ob1;

        ob.EnterFlowersFromFile();
        ob1 = ob;

        ob1.ShowFlowers();

        getch();
        return 0;
}
//---------------------------------------------------------------------------
Anubys вне форума Ответить с цитированием
Старый 21.10.2011, 18:07   #2
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

В вашем случае будет просто неявное присвоение полей одного класса другому.
А конструктор копирования, на то он и констуктор, что он вызывается в момент создания объекта (инициализации).
Код:
int main(int argc, char* argv[])
{
        Flower ob;

        ob.EnterFlowersFromFile();
        Flower ob1 = ob;

        ob1.ShowFlowers();

        getch();
        return 0;
}
An1ka вне форума Ответить с цитированием
Старый 21.10.2011, 20:50   #3
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Что значит "не работает" конструктор копирования?! И где вы его используете?
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 24.10.2011, 08:30   #4
Anubys
Форумчанин
 
Регистрация: 08.05.2010
Сообщений: 177
По умолчанию

Здесь кажется все в порядке, но боюсь неправильно написанный конструктор копирования. Использовал прежде динамическую память, ничего не работало, убрал и все заработало. Может вы подскажете в чем проблема я новичок в ООП
Код:
//---------------------------------------------------------------------------
#include <iostream>
#include <fstream.h>
#include <vcl>
#include <conio>
#include <iomanip>
#pragma hdrstop

//---------------------------------------------------------------------------
class Flower
{
        private:
           int  pelustok;
           string month;
        protected:
           string color;
        public:
           string title;
           Flower()
           {
                pelustok = 20;
                color    = "Red";
                title    = "Roza";
                month    = "April";

           }
           // Завантаження з файла
           Flower(char *file)
           {
                ifstream ofs(file);

                ofs >> title >> pelustok >> color >> month;

                ofs.close();
           }

           Flower(const Flower& a)
           {
                pelustok = a.pelustok;
                color    = a.color;
                title    = a.title;
                month    = a.month;
                
           }

           void ShowFlower()
           {
                cout << title << "\t" << pelustok << "\t"
                     << color << "\t" << month << endl;

           }
};


int main(int argc, char* argv[])
{
        Flower obj;

        obj.ShowFlower();

        Flower obj1 = obj;

        obj1.ShowFlower();

        Flower obj2(obj);

        obj2.ShowFlower();

        getch();
        return 0;
}
//---------------------------------------------------------------------------
Anubys вне форума Ответить с цитированием
Старый 25.10.2011, 19:13   #5
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Я не вижу никаких проблем в вашем конструкторе копирования. Вы не указали, какие у вас возникли проблемы.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 26.10.2011, 23:11   #6
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

for(int i = 0;Number_of_petals[i] != NULL;i++) - массивы в с и с++ не заканчиваются нулем. цикл будет крутиться пока в памяти не встретится ноль.

второй баг: в конструкторе копировния в Number_of_petals - 10 обьектов, хотя в том объекте, который пришел в конструктор их может быть меньше => выход за пределы массивов.

третий баг: не все мебмеры класса скопированны из объекта, переданного в конструктор копирования.

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

мебмеры будут выглядеть примерно так:
private:
std::vector<int> Number_of_petals;
int total;
int position;
protected:
std::vector<std::string> color;
std::vector<std::string> month;
public:
std::vector<std::string> title;

не совсем понятно, массивы ли вам нужны? если все таки массивы - то подумайте об обьединении мемберов в структуру и храните уже массив этих структур в весторе.

Последний раз редактировалось _Ч_; 26.10.2011 в 23:14.
_Ч_ вне форума Ответить с цитированием
Старый 26.10.2011, 23:20   #7
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

да и вообще класс цветка у вас на самом деле это массив цветков. это нужно выразить по правильному, а не так извращенно. Вторая версия кода без массивов - более правильный вариант. если вам нужны массивы цветков, то и работайте с массивом обьектов типа Flower.
с векторами по прежнему будет все просто:
std::vector<Flower> array1;
// заполнение массива.
std::vector<Flower> array2 = array1;
_Ч_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
конструктор копирования revaldo666 Общие вопросы C/C++ 10 21.06.2011 22:42
Конструктор копирования Сtrl Общие вопросы C/C++ 6 31.03.2011 10:18
Конструктор копирования DartDayring Общие вопросы C/C++ 4 16.11.2010 17:46
Конструктор копирования. 123er4 Общие вопросы C/C++ 4 13.06.2010 01:27