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

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

Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Проблема: при выводе на экран (ф-ция show() ;) - выводятся только последниие введенные данные. Как всё увидеть?

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

class bank
{   
private:
    char bank_name[44];
    char name[44];
    int value;
public:
    bank();
    bank(char *,char *,int);
    bank (const bank &a);
    void show();
};
int n,m;
bank::bank() : value(0)
{
    *bank_name = *name = '\0';
}
bank::bank(char *bank_name,char *name,int _value)
{
    cout<<" input _name of bank:"<<endl;
	cin>>bank::bank_name;
    cout<<" how mach persons:"<<endl;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cout<<" input person:"<<endl;
		cin>>bank::name;

        cout<<"input value:"<<endl;
        cin>>_value;
        value=_value;
    }
}
void bank::show()
{
    cout<<bank_name<<endl;
	for(int i=0;i<n;i++)
	{
	cout<<name<<endl;
	cout<<value<<endl;
	}
}
bank::bank(const bank &a)
{
	strcpy(bank::bank_name,bank_name);
	strcpy(bank::name,name);
	  
}

void main()
{
    bank obj;
	bank object("0","0",0);
	bank ob(object);
	object.show();
    system("PAUSE");
}
azrael
Сообщения: 89
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

Евгений Александрович, это потому, что вы n раз вводите данные в один и тот же объект.
А потом в функции show() вы еще n раз и выводите одни и те же данные из объекта bank :) ))

Уберите работу с консолью из конструктора, создайте отдельную функцию, которая будет n раз спрашивать у пользователя значения полей и создавать новый объект bank, передавая его конструктору эти значения. Можно в этой функции создать массив объектов bank, а потом на каждом вызвать функцию show().
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

создавать новый объект bank, передавая его конструктору эти значения
Как это понять ? А как реализовать не могу представить.
Уберите работу с консолью из конструктора, создайте отдельную функцию, которая будет n раз спрашивать у пользователя значения полей
Это ли Вы имели в виду? :

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

class bank
{   
private:
    char bank_name[44];
    char name[44];
    int value;
public:
    bank();
    bank(char *,char *,int);
	void enter();
    void show();
};
int n,m;
bank::bank() : value(0)
{
    *bank_name = *name = '\0';
}
bank::bank(char *bank_name,char *name,int _value)
{
	strcpy(bank::bank_name,bank_name);
	strcpy(bank::name,name);	 
	value=_value;
}
void bank:: enter()
	{
    cout<<" input _name of bank:"<<endl;
	cin>>bank::bank_name;
    cout<<" how mach persons:"<<endl;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cout<<" input person:"<<endl;
		cin>>bank::name;

        cout<<"input value:"<<endl;
		cin>>bank::value;  
	}
}
void bank::show()
{
    cout<<bank_name<<endl;
		cout<<name<<endl;
		cout<<value<<endl;
}
 
void main()
{
    bank obj;
    bank object("0","0",0);

    system("PAUSE");
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Да я уже устал говорить, что работы с cin и cout в конструкторе быть не должно. Не слушает он :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

а что тогда, в моем случае, должно в нем быть?
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Евгений Александрович, у Вас вообще странная архитектура получается. Вы описали класс, у экземпляра которого ОДНО поле bank_name, ОДНО поле name, ОДНО поле value. Что вполне логично.
Но в методе enter Вы пытаетесь заполнить НЕСКОЛЬКО bank_name-ов и value-ов.
"Но, Холмс, черт возьми, КАК?" (c) Где/Как/Одкуда в ОДНОМ экземпляре класса Вы пытаетесь взять НЕСКОЛЬКО этих полей?
В таком случае уж объявляйте в описании класса МАССИВ (точнее, указатель на массив) bank_name-ов и value-ов, после того, как станет ясно количество, выделяйте динамически массивы bank_name-ов и value-ов и после этого заполняйте.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Я сделал вот так. Можно ли так ?
P.S. зато, вроде, работает.

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

class bank
{   
private:
	char bank_name[55];
    char name[44];
    int value;
public:
	bank();
	bank( char *,class bank *);
    void enter(class bank *);
    void show(class bank *);
};

bank::bank()
{
	*name='\n';
	int n=0;
}
int n;
bank::bank(char *bank_name,class bank *p)
{
	cout<<" input bank name:"<<endl;
	for(int i=1;i<n;i++)
	cin>>p[i].bank_name;
}
void bank::enter(class bank *p)
{
	for(int i=0;i<n;i++)
	{
		cout<<" name:"<<i<<endl;
		cin>>p[i].name;
		cout<<" value:"<<i<<endl;
		cin>>p[i].value;
		system("cls");
	}
}
void bank::show(class bank *p)
{
	for(int i=1;i<n;i++)
	cout<<p[i].bank_name<<endl;
	for(int i=0;i<n;i++)
	cout<<p[i].name<<" "<<p[i].value<<endl;
}

void main()
{
class bank *p;
cout<<" size:"<<endl;
cin>>n;
p=(class bank *)malloc(n*sizeof(bank));
bank object;
bank obj("0",p);
object.enter(p);
object.show(p);
system("PAUSE");
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Это просто кошмар какой-то.

1. Функции malloc нельзя использовать для с классами - при его вызове не вызываются конструкторы. Используй new.
2. Где free? (когда сменишь malloc на new, то free сменишь на delete)
3. Для чего нужна функция enter? Они не работает с полями класса, так почему она должна быть членом класса?
4. Цикл, который находится внутри enter должен быть вынесен из класса в функцию main. Каждый объект должен сам выставлять своё состояние. Если это делает за него какая-то другая функция, причём работает сразу с массивом - это выглядит просто чудовищно. Стаёт вопрос зачем вообще нужны конструкторы для класса.
5. Зачем конструктор, принимающий и имя и банк, он ведь всё равно нигде не используется.
6. Глобальная переменная n не меньшее зло, чем функция enter. Сделай её локальной и передавай внутрь функций, если нужно (вообще если ты выполнишь все пункты вверху, то передавать ничего не будет нужно, так как архитектура нормализуется)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Думаю, выполнил пункты 1,2 и 6.
На счет остальных: преподаватель скажет, к сожалению: " Хм.. а где твоя ф-ция ввода, где конструктор по умолчанию, где конструктор с параметрами!?"
Каждый объект должен сам выставлять своё состояние. Если это делает за него какая-то другая функция, причём работает сразу с массивом - это выглядит просто чудовищно
Это я совсем не понял :(

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

class bank
{   
private:
	char bank_name[55];
    char name[44];
    int value;
public:
	bank();
	bank( char *,class bank *,int n);
    void enter(class bank *,int n);
    void show(class bank *,int n);
};

bank::bank()
{
	*name='\n';
	int n=0;
}
bank::bank(char *bank_name,class bank *p,int n)
{
	cout<<" input bank name:"<<endl;
	for(int i=1;i<n;i++)
	cin>>p[i].bank_name;
}
void bank::enter(class bank *p,int n)
{
	for(int i=0;i<n;i++)
	{
		cout<<" name:"<<i<<endl;
		cin>>p[i].name;
		cout<<" value:"<<i<<endl;
		cin>>p[i].value;
		system("cls");
	}
}
void bank::show(class bank *p,int n)
{
	for(int i=1;i<n;i++)
	cout<<p[i].bank_name<<endl;
	for(int i=0;i<n;i++)
	cout<<p[i].name<<" "<<p[i].value<<endl;
}

void main()
{
class bank *p;
cout<<" size:"<<endl;
int n;
cin>>n;
p=new bank[n];
bank object;
bank obj("0",p,n);
object.enter(p,n);
object.show(p,n);
system("PAUSE");
delete p;
}
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Romeo писал(а):Это просто кошмар какой-то.
Если честно, прочитав код в сообщенни #17 (в особенности, как КОНСТРУТКОР ничего не делает собственно с экземпляром this, но зато заполняет массив экземпляров, переданный как параметрам), я вспомнил восхитительный старый сюжет из "Ералаша" под названием "АриХметика". Тот, где первоклашка делил 28 на 7, получал 13. Потом этот проверялось умножением, и сходилось (13*7 = 28, "Ну, компьют, ты балдеешь!" - произносит, видя это, старшеклассник). Потом уэе за дело принимался шафствующий над первоклашкой старшеклассник, и проверял сложением. И "флюиды" первоклашки так подействовали на него, что и у него результат проверки сошелся (13+13+13+13+13+13+13 = 28).
Ответить