Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Выделение памяти в конструкторе


Автор: paSha_X 25.12.2006, 17:32
Вот начал писать программу, в конструкторе надо выделить память под данные класса.............Вообщем всё компилируется, но мне кажется что что-то не то, посмотрите пжалста опытным взглядом, правильно выделяется память или нет?????
Код

#include<iostream.h>
#include<string.h>
class base{
    char *name;
public:
    base()
    {
        name=new char[20];
        cout<<"Konstruktor classa base..."<<endl;
    }
    ~base()
    {
        delete[]name;
        cout<<"Destruktor classa base..."<<endl;
    }
    void set(char* n)
    {
        strcpy(name,n);
    }
};
class proizv:public base
{
    int *kol;
    double *price;
    int *date;
public:
    proizv():base()
    {
        kol=new int;
        price=new double;
        date=new int;
        cout<<"Konstruktor classa proizv..."<<endl;
    }
    ~proizv()
    {
        delete kol;
        delete price;
        delete date;
    }
    void set(int* k,double* p,int* d)
    {
        kol=k;
        price=p;
        date=d;
    }
};
void main(){}

Автор: Rockie 25.12.2006, 17:59
Цитата(paSha_X @  25.12.2006,  17:32 Найти цитируемый пост)
 правильно выделяется память или нет?????

paSha_X, бессмысленно, но правильно =)

Код
void set(int* k,double* p,int* d)

почему передается по указателю?

Автор: Anikmar 25.12.2006, 18:02
    void set(char* n)
    {
        strcpy(name,n);
    }

А если строка будет больше 20? Где контроль длины?

Автор: paSha_X 25.12.2006, 18:08
Rockie,  вот это меня и ввело в заблуждение, без указателей ERROR.......

Anikmar, это условно, просто строка максимум 20......

Автор: Xenon 25.12.2006, 18:16
paSha_X, сделай конструтор base() с параметром, аля int size.

Автор: Anikmar 25.12.2006, 18:22
Цитата(paSha_X @  25.12.2006,  18:08 Найти цитируемый пост)
Anikmar, это условно, просто строка максимум 20...... 

Условно-не условно, а потом при тесте будешь голову ломать откуда AV вылазит.
Если условно, то хоть 200 сделай, 20 совсем уж маленькая строка

Автор: paSha_X 25.12.2006, 18:23
Это я всё сделаю, меня интересует вот это:
Код

 void set(int* k,double* p,int* d) 

Цитата(Rockie @  25.12.2006,  17:59 Найти цитируемый пост)
почему передается по указателю? 


Автор: Anikmar 25.12.2006, 18:24
А зачем по указателю?
Можно так:
Код

   void set(int k,double p,int d)
    {
        *kol=k;
        *price=p;
        *date=d;
    }

Автор: paSha_X 25.12.2006, 18:29
Ок всем спасибо, во всём разобрался.......

Автор: Daevaorn 25.12.2006, 19:11
paSha_X, без своих контсруктора копирования и оператора присваивания будет очень интересный эффектsmile

Автор: paSha_X 25.12.2006, 19:40
Да уж, всё равно не то что-то
разве вот тут можно присваивать указателю эти значения....?
Всё работает но не выводит эти 3 элемента( kol , price , date)
Код

void set(int k,double p,int d)
    {
        *kol=k;
        *price=p;
        *date=d;
    }


Вот накидал по этому же принципу простой класс, посмотрите, выводит шелуху какую-то.......
Код

#include<iostream.h>
class myclass
{
    int *x;
public:
    
    myclass(){x=new int;}
    ~myclass()    {delete x;    }
    void set(int xx)    {*x=xx;    }
    void show()            {cout<<x<<endl;}
};
void main()
{
myclass ob;
ob.set(1);
ob.show();
}

Автор: Daevaorn 25.12.2006, 19:49
Цитата(paSha_X @  25.12.2006,  20:40 Найти цитируемый пост)
 выводит шелуху какую-то

это не шелуха, а адрес выделенной памятиsmile
Цитата(paSha_X @  25.12.2006,  20:40 Найти цитируемый пост)
Всё работает но не выводит эти 3 элемента( kol , price , date)

если выводишь так же как и "шелуху", то ясно почему не то выводитsmile
Разыменовывать указатель нужно.

Автор: paSha_X 25.12.2006, 19:53
Цитата(Daevaorn @  25.12.2006,  19:49 Найти цитируемый пост)
Разыменовывать указатель нужно. 


Это как???

Автор: Daevaorn 25.12.2006, 19:56
paSha_X, 
Код

*x

Автор: paSha_X 25.12.2006, 20:03
Daevaorn, Ясно, спасибо......

Автор: Rockie 25.12.2006, 20:18
paSha_X, проще говоря указатель - это переменная, которая содержит адрес другой переменной. 
Код
cout<<x<<endl;

Здесь мы выводим содержимое указателя, то есть адрес, который в нем содержится.

Код
cout<<*x<<endl;

Здесь выводим содержимое, то что находится по адресу, который содержится в указателе x.
После вызова метода Set() там единица

В свою очередь, так как указатель это переменная, у указателя есть свой собственный адрес,
его тоже можно вывести:
Код
cout<<&x<<endl;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)