конструкторы

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Вобще, складывается впечатление, что Евгений Александрович пытается что-то сделать, не имея представления что нужно получить в итоге. (Ну и не понимая смысл слова "конструктор").

Возьмем опсаиние класса. Нигде не указано, каков смысл полей name и value? Я могу еще предположить, что класс описывает банк, а поле bank_name - наименование этого банка.
Но что такое name и value???
Интуитивно складывается ощущение (судя по исходнику, где фигурируют слова 'onput person'), то, все-таки. требуется как-то сохранить имена клиентов банка и их некоторую "величину" (value). Но если взглянуть на описание класса, то получается, что у каждого банка предполагается ТОЛЬКО ОДИН КЛИЕНТ. Поэтому-то, как я предполаю, программа и "сходит с ума". Т.к. ее автор хочет сохранить в экземпляре класса НЕСКОЛЬКО клиентов, а сам ответ лам место ТОЛЬКО ДЛЯ ОДНОГО.
Собственно, я об этом и писал чуть выше, когда предлагал заменить name и value на массивы.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

поле name - клиенты. поле value - номер их счета.
И код работает как мне нужно :)
Т.е. Вы хотите сказать, что моя реализация в сообщении 18 совсем неправильная?
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Они хотят сказать вам, что нельзя использовать реквизит ради реквизита. Такое впечатление, что наличие класса здесь ради галочки...
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Евгений Александрович писал(а):поле name - клиенты. поле value - номер их счета.
"Он и в теретий раз..."
Ага, "клиентЫ". Все-таки, множественное число. Т.е., у одного банка (экземпляр класса bank) предполагается наличие нескольких клиентов. Евгений Александрович, быть может, Вы, все-таки, объясните, как в ОДНО поле name [экземпляра класса bank], Вы собираетесь поместить информацию о НЕСКОЛЬКИХ клиентах?

А автор сообщения #18 (по крайней мере, в настоящий момент) - Romeo.

И, боюсь, что в число int номер банковского счета не запихнете. Даже у беззнакового int максимальное значение порядка 4 миллиардов, а номера банковских счетов - 20-значные.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

BBB, ну что ж ты вопросы такие глупые задаёшь? У него ж всё работает! Евгению Александровичу сей факт куда важнее и больше греет душу, чем все наши философские размышления о том, как оно должно быть на самом деле.

Видишься чудную гексагональную конструкцию на вершине сего могучего дерева, сынок? Это наш новый дом, малыш. И не думай, что твой папка - дурак. Не смотри, что в доме входная дверь на крыше, а окна смотрят вниз. Забудь о том, что у телека кинескоп развёрнут внутрь и кровати прибиты к потолку. Это ведь дом и в нём можно жить. Мы будем в нём счастливы.

Извините за ироничную миниатюру, не удержался. Старался исключительно во благо, а не из желания поиздеваться.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Евгений Александрович писал(а):поле name - клиенты. поле value - номер их счета.
И код работает как мне нужно :)
Т.е. Вы хотите сказать, что моя реализация в сообщении 18 совсем неправильная?
Посмотрел реализацию в сообщении #19.
И вижу, что Вы создаете (даже если закрыть глаза на то, что это делеется через Альпы) n банков, у каждого из которых по одному клиенту.
Это и есть "как мне нужно"? :) Хорошенькая модель данных! :)

Ну и "классическая" ошибка при освобождении памяти, когда был выделен массив:
delete p; // так неверно!
delete [] p; // вот так верно!
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

delete [] p; // вот так верно!
спасибо.
Вы, наверное, правы в том, что я не совсем правильно делаю, создавая n банков.
предлагал заменить name и value на массивы.
Каким образом это делается относительно моего случая. Если можно, поподробнее.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Код: Выделить всё

#include <string>
#include <vector>

class CBank
{
   std::string m_strBankName;
   std::vector<std::string> m_vecClientNames;
public:
   ...
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Romeo писал(а):

Код: Выделить всё

class CBank
{
   std::string m_strBankName;
   std::vector<std::string> m_vecClientNames;
public:
   ...
}
Или, если не связываться с std::string и std::vector<std::string>:

Код: Выделить всё

typedef char [55] tClientName;

class tBank
{
   char [44] bank_name;
   tClientName * names;
   int * values;
public:
   ...
} ;
После запроса количества клиентов (получается, правда, что по ходу работы программы это колиечество остается неизменным, но если это "проверочная" задача, то, возможно, такой вариант устроит) выделять нужное количество памяти под имена и номера счетов, и заполнять их. А в деструкторе не забыть эту память освободить:

names = new [n] tClientName;
values = new [n] int;


деструктор:

Код: Выделить всё

tBank::~tBank (void)
{ delete [] names;
 delete [] values;
};
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Думаю, я уловил идею. Вопрос : если я хочу сделать так, чтобы у одного человека был не 1 счет, а несколько .т.е после ввода имени спросить о кол-ве считов и ввести эти счета.

Код: Выделить всё

class bank
{   
private:
	char *bank_name;
	char **name;
	int *value;
public:
	bank(){}
	void add(int);
	void show(int);
};
void bank::add(int n)
{
    bank_name=new char[33];
    cout<<"input bank_name\n"<<endl;
	cin>>bank_name;

	char str[55];
	name=new char *[n];
	value=new int [n];
for(int i=0;i<n;i++)
{
	system("cls");
	cout<<i<<":iput name:\n"<<endl;
	cin>>str;
	name[i]=new char[strlen(str)+1];
	strcpy(name[i],str);
	cout<<"input value:"<<endl;
	cin>>value[i];
}
system("cls");
}
void bank::show(int n)
{
	cout<<bank_name<<endl;
	for(int i=0;i<n;i++)
	cout<<name[i]<<" "<<value[i]<<endl;
	delete []name;
	delete []bank_name;
	delete []value;
}
void main()
{
	int n;
	bank object;
	cout<<" size (n):"<<endl;
	cin>>n;
	bank obj;
	obj.add(n);
	obj.show(n);
	system("PAUSE");
}
Ответить