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


Автор: Павлуха 26.11.2006, 19:03
Помогите пжалста, вот программа.........колупался, но ничего не получилось, как выделеть в этой программе память объектам динамически!!!!???
Код

#include<iostream.h>
#include<string.h>
#include<stdio.h>
class worker
{    char fio[20];
    int number;
    int hours;
    int oplata;

public:
    void set(char*f,int n, int h,int o){strcpy(fio,f);number=n;hours=h;oplata=o;}//метод присваивания значений 
    void show(){cout<<fio<<' '<<number<<' '<<hours<<' '<<oplata;;}//метод вывода информации на экран
    
        
};
void main()
{
    int sotr,otd,i,j,lim1=1,lim2,buf[10];
    char f[20]; 
    int n,h,o;
worker obw[10][20];//10 отделов по 20 сотрудников 
cout<<"Kol-vo otdelov v firme: ";cin>>otd;
for(i=0;i<otd;i++)//цикл создания отделов
{
cout<<"Kol-vo sotrudnikov v otdele nomer "<<i+1<<": ";
cin>>sotr;
lim2=1;
    for(j=0;j<sotr;j++)//цикл создания списка сотрудников в отделе i
    {
    cout<<"Otdel "<<lim1<<":"<<endl;
    cout<<"Sotrudnik "<<lim2<<": "<<endl;
    cout<<"F.I.O. sotrudnika: "<<endl; 
    gets(f);
    cout<<"Tabel number: ";cin>>n;
    cout<<"Otrabotano chasov v mesyac: ";cin>>h;
    cout<<"Pochasovaya tarifnaya oplata: ";cin>>o;
    obw[i][j].set(f,n,h,o);
    lim2++;
    buf[i]=sotr;
    }lim1++;
}

//вывод всей введённой информации
    lim1=1;
for(i=0;i<otd;i++)
{    lim2=1;
    cout<<'\n'<<"Otdel "<<lim1<<":"<<endl;
    for(j=0;j<buf[i];j++)
    {    
        cout<<'\n'<<"Sotrudnik "<<lim2<<": "; obw[i][j].show();
        lim2++;
    }lim1++;
}
cout<<endl;
}

Автор: GrayCardinal 26.11.2006, 19:11
int * buf;
char *f;
buf = new int[10];
f = new char[20];

Что за воркер ? Ну да ладно
worker ** obw;
int i;
worker = new worker *[10];
for (i = 0; i < 10; ++i)
  obw[i] = new worker[ 20]

Удалять в обратную сторону.
Зачет  smile 

Автор: Voldemar2004 26.11.2006, 19:12
Память для объекта класса Worker?

Автор: Павлуха 26.11.2006, 19:32
Цитата(Voldemar2004 @ 26.11.2006,  19:12)
Память для объекта класса Worker?

да

Автор: _stranger_ 27.11.2006, 13:26
GrayCardinal, видимо имел ввиду
Код

   ...

   worker ** obw = new worker *[10];
   ...



 smile 

Автор: ip127001 27.11.2006, 14:23
еще если количество массивов известно можно так задать

int *obw[10]=new int[10][_size];

Добавлено @ 14:29 
Цитата(GrayCardinal @  26.11.2006,  19:11 Найти цитируемый пост)
int * buf;
char *f;
buf = new int[10];
f = new char[20];


про delete надо сказать натворит парень дело smile 

в конце проги надо динамическую память освобождать
 delete f;-переменная
 delete[] f;-массив

Автор: Павлуха 29.11.2006, 00:30
Вот так???

Код

void main()
{    int * buf;                    //!!!!!!
    char *ff;                    //!!!!!!!!
    buf = new int[2];            //!!!!!!!
    ff = new char[25];            //!!!!!!
    int i;                        //!!!!!!!!
    stud **ob = new stud *[2];    //!!!!!!!!

    for (i = 0; i < 10; i++)
  ob[i] = new stud [25];

    
    stud sekciya[2][25];// создание объекта(2 секции по 25 фамилий) 
    int k1,k2,v;
    char f[30];
    while(1){    cout<<"****MENU****"<<'\n'<<"Sozdat spiski studentov...................(1)"<<'\n'
                                    <<"Vivesti otsortirovannie spiski..................(2)"<<'\n'
                                    <<"Vivesty spisok ychastnikov 1-y i 2-h sekciy.....(3)"<<endl;
    cin>>v;
    switch(v){
    case 1:    cout<<"kol-vo studentov v 1 sekcii:";    //ввод
            cin>>k1;
            for(i=0;i<k1;i++)
            {
                cin>>f;
                sekciya[0][i].set(f);
            }
            cout<<"kol-vo studentov vo 2 sekcii:";
            cin>>k2;
            for(i=0;i<k2;i++)
            {
                cin>>f;
                sekciya[1][i].set(f);
    }break;
    case 2:    sort(sekciya,k1,k2);break;//вызов метода сортировки списков
    case 3: run(sekciya,k1,k2);break;//вызов метода вывода списков студентов занимающихся в 1-й и 2-х секциях
            }
    }
    for (i = 10; i > 0; i--)//!!!!!!!!!!
    delete [i]ob;            //!!!!!!!!!!
}

Автор: Xenon 29.11.2006, 00:58
Я вот этого участка не понимаю.
Код

   stud **ob = new stud *[2];    //!!!!!!!!

    for (i = 0; i < 10; i++)
  ob[i] = new stud [25];

Указатель указателей ссылается на два указателя. И ты на эти два указателя хочешь повесить 10 объектов?

Автор: _stranger_ 29.11.2006, 13:32
Павлуха, не забывай освобождать память...

Код


  //удаляем память...
  for(i = 0;i < 10;i++)
     delete [] ob[i];  
  delete [] ob;
  delete [] buf;
  delete [] ff;


Автор: Павлуха 29.11.2006, 14:53
Цитата(Xenon @ 29.11.2006,  00:58)
Я вот этого участка не понимаю.
Код

   stud **ob = new stud *[2];    //!!!!!!!!

    for (i = 0; i < 10; i++)
  ob[i] = new stud [25];

Указатель указателей ссылается на два указателя. И ты на эти два указателя хочешь повесить 10 объектов?

Ну так, блин не понимаю я какой принцип выделения прамяти, объясните пжалста что тут и как!!?? smile  

Автор: Xenon 29.11.2006, 15:22
Ну если ты создал ДВА указателя, то к ним ты можешь привязать ДВА адресса, а не 10 smile
stud **ob = new stud *[10];
Так тогда пиши

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