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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2016, 13:11   #1
yankel
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 22
По умолчанию С++, классы

Код:
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iomanip>
#include <windows.h>
#include <malloc.h>
#define N 3
using namespace std;
class office {
 char *name;
 char *creater;
 unsigned int count;
 float price;
public:
 void set(char *a,char *b,unsigned int c, float d);
 void get(char *a, char *b, unsigned int &c, float &d);
 void show(void);
};

void office::set(char *a,char *b,unsigned int c,float d) {
 a=new char [strlen(name)+1];
 strcpy(name,a);
 b=new char [strlen(creater)+1];
 strcpy(creater,b);
 count=c;
 price=d;
}

void office::get( char * a, char *b, unsigned int &c, float &d)
{
 a=new char [strlen(name)+1];
 strcpy(a,name);
 b=new char [strlen(creater)+1];
 strcpy(b,creater);
 c=count;
 d=price;
}

void office::show(void) {
 cout<<name<<" ";
 cout<<creater<<" ";
 cout<<count<<" ";
 cout<<price<<" ";
}


int main(void) {
  char *n;
  n=(char *)malloc(80*sizeof(char));
  char *t;
  t=(char *)malloc(80*sizeof(char));
  unsigned int s;
  float h;
  short i;
SetConsoleCP(1251);
SetConsoleOutputCP(1251); 
 
 office obj[N];
 system("cls");
 cout<<"Работа функции SET!\n";
 for (i=0; i<N; i++)
 {           
   cout<<"Название, Производитель, Количество, Цена: ";
   cin>>n;
   cin>>t;
   cin>>s;
   cin>>h;
   obj[i].set(n,t,s,h);
 }
 cout<<"Работа функции SHOW!\n";
 cout<<"Название, Производитель, Количество, Цена: \n";
 for (i=0; i<N; i++)
 {
   obj[i].show();
   cout<<"\n";
  }
 cout<<"Работа функции GET и SHOW!\n";
 cout<<"Название, Производитель, Количество, Цена: \n";
 for(i=0; i<N; i++)
 {
   obj[i].get(n,t,s,h);
   obj[i].show();
   cout<<"\n";
  }
getch();
delete[] n;
delete [] t;
return 0;
}
При отладке выдает следующее: Необработанное исключение в "0x53c8f8e0" в "45.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcccccccc".

Заранее спасибо за помощь
yankel вне форума Ответить с цитированием
Старый 23.02.2016, 13:23   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Странный код. Сделайте отдельные функции get/set работающие с одним свойством, а не всеми сразу. И если C++, то используйте std::string для строк. И либо new/delete (C++), либо malloc/free (C), а не вперемешку.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.02.2016, 13:38   #3
yankel
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 22
По умолчанию

Спасибо,
Цитата:
И если C++, то используйте std::string для строк. И либо new/delete (C++), либо malloc/free (C), а не вперемешку.
- принято к сведению:

Код:
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iomanip>
#include <windows.h>
#define N 3
using namespace std;
class office {
 char *name;
 char *creater;
 unsigned int count;
 float price;
public:
 void set(char *a,char *b,unsigned int c, float d);
 void get(char *a, char *b, unsigned int &c, float &d);
 void show(void);
};

void office::set(char *a,char *b,unsigned int c,float d) {
 a=new char [strlen(name)+1];
 strcpy(name,a);
 b=new char [strlen(creater)+1];
 strcpy(creater,b);
 count=c;
 price=d;
}

void office::get( char * a, char *b, unsigned int &c, float &d)
{
 a=new char [strlen(name)+1];
 strcpy(a,name);
 b=new char [strlen(creater)+1];
 strcpy(b,creater);
 c=count;
 d=price;
}

void office::show(void) {
 cout<<name<<" ";
 cout<<creater<<" ";
 cout<<count<<" ";
 cout<<price<<" ";
}


int main(void) {
  char *n;
  char *t;
  unsigned int s;
  float h;
  short i;
SetConsoleCP(1251);
SetConsoleOutputCP(1251); 
 
 office obj[N];
 system("cls");
 cout<<"Работа функции SET!\n";
 for (i=0; i<N; i++)
 {           
   cout<<"Название, Производитель, Количество, Цена: ";
   cin>>n;
   cin>>t;
   cin>>s;
   cin>>h;
   obj[i].set(n,t,s,h);
 }
 cout<<"Работа функции SHOW!\n";
 cout<<"Название, Производитель, Количество, Цена: \n";
 for (i=0; i<N; i++)
 {
   obj[i].show();
   cout<<"\n";
  }
 cout<<"Работа функции GET и SHOW!\n";
 cout<<"Название, Школа, Количество монахов, Площадь земли: \n";
 for(i=0; i<N; i++)
 {
   obj[i].get(n,t,s,h);
   obj[i].show();
   cout<<"\n";
  }
getch();
delete[] n;
delete [] t;
return 0;
}
Цитата:
Сделайте отдельные функции get/set работающие с одним свойством, а не всеми сразу.
- поясните, потому что на мой ничему не обученный взгляд, так и происходит
yankel вне форума Ответить с цитированием
Старый 23.02.2016, 13:45   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
string getName();
void setName(string newName);

float getPriice();
void setPrice(float newPrice);
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.02.2016, 13:56   #5
yankel
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 22
По умолчанию

Да но задача поставлена так, что эти функции должны быть разработаны
yankel вне форума Ответить с цитированием
Старый 23.02.2016, 23:20   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Вы сначала вводите в указатель, а только потом память выделяете.
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы D1894 Помощь студентам 0 03.04.2013 20:27
Классы Vitalka Помощь студентам 1 24.02.2011 15:35
Классы в C++ execut1oner Помощь студентам 5 19.12.2010 00:44
классы в Си++ kseshenka Помощь студентам 1 08.12.2010 19:07