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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2010, 17:27   #1
Jane-sad
Пользователь
 
Регистрация: 28.04.2010
Сообщений: 22
По умолчанию С++ (конструктор, деструктор, копирующий конструктор)

Учусь программировать. Создала класс. Инициализировала два объекта класса. Вывод на экран оюъектов класса. Вроде все работает. Но как только откомментирую деструктор программа снимается и еще интуитивно чувствую что что-то не так с констуктором копирования.
ПОмогите, пожалуйста. Исправьте мне мои ошибки. Это только начала моего задания. Спасибо.


Код:
#include <iostream.h> 
#include <string.h> 
#define n 2 //количество объектов класса

class string
{
	public:
	char *str;
	string(char *a); //конструктор
	string(const string &bb);//копирующий конструктор
	//~string();
	void show(void);
};


string::string(char *a)
{
 str=new char [strlen(a)+1];
 strcpy(str,a);  }

//копирующий конструктор
string::string(const string &bb)
{
str=new char [strlen(bb.str)];
 strcpy(str,bb.str);

}

/*string::~string()
{
delete[] str;
return;

}*/


void string::show(void)
{cout<<str<<"\n ";	}

int main (void)
{
	int i;
	string  obj[n]= { string("JANNA"),
		          string("TANYA")};

             cout<<"\nRezultat :\n";

		for (i=0; i<n; i++)
			{obj[i].show();
				cout<<"\n";}

	
 }

Последний раз редактировалось Stilet; 01.10.2010 в 09:34.
Jane-sad вне форума Ответить с цитированием
Старый 30.09.2010, 21:58   #2
sergey.d
Пользователь
 
Регистрация: 23.08.2010
Сообщений: 98
По умолчанию

Почти все правильно, но в конструкторе копирования был глючок -- не выделялась память под конечный '\0'

Код:
#include <iostream>
#include <string.h>
#define n 2 //количество объектов класса

using namespace std; // в этом пространстве имен объявлены потоки ввода вывода (и многое другое :) )

namespace myself // весьма вероятен конфликт имени класса string, поэтому создаем свое пространство имен
{
    class string
    {
    public:
        string(const char *a); //конструктор
        string(const string &s);//копирующий конструктор
        ~string();
        // для полноты счастья опишем оператор присваивания
        string &operator = (const string &s);
        void show(void);

    private: // такие данные лучше закрыть от пользователей класса
        char *_str;
    };


    string::string(const char *c)
    {
        strcpy(_str = new char [strlen(c) + 1], c);
    }

    //копирующий конструктор
    string::string(const string &s)
        : _str(0)
    {
        //str = new char [strlen(bb.str)]; // тут была ошибка - не выделялась память под '\0'
        //strcpy(str, bb.str);
        *this = s; // воспользуемся оператором присваивания, чтобы не дублировать код
    }

    string &string::operator =(const string &s)
    {
        if(this != &s)
        {
            delete [] _str;
            strcpy(_str = new char [strlen(s._str) + 1], s._str);
        }
        return *this;
    }

    string::~string()
    {
        delete[] _str;
        //return; -- это не нужно здесь
    }

    void string::show(void)
    {
        cout << _str << endl;
    }

}

int main (void)
{
    myself::string obj[n]= { myself::string("JANNA"), myself::string("TANYA") };

    cout << "Result :" << endl;
    for (int i = 0; i < n; ++i) // удобно объявлять счетчики в самом цикле
    {
        obj[i].show();
        cout << endl; // "\n"; -- манипуляторы кошернее :)
    }
}
sergey.d вне форума Ответить с цитированием
Старый 01.10.2010, 10:01   #3
Jane-sad
Пользователь
 
Регистрация: 28.04.2010
Сообщений: 22
По умолчанию

Спасибо большое за помощь. Из ваших слов я поняла, что я могу просто заменить в своем коде имя класса, чтоб небыло конфликта и плюс в конструкторе провести исправления.
Jane-sad вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
конструктор An123 Помощь студентам 1 17.01.2010 17:14
С++ Конструктор и Деструктор помогите Maxim_Burea Помощь студентам 15 19.09.2009 19:45
С++ (конструктор, деструктор) Kventin Помощь студентам 4 31.03.2009 18:11
Конструктор PilGrim Общие вопросы C/C++ 0 16.01.2009 10:21