Консультация № 168519
29.05.2009, 21:01
0.00 руб.
0 1 1
Здраствуйте, появился еще вопрос :(
Создаю массив объектов, потом вызываю каждому объекту метод, но наверно чтото зделал нетак, т.к. все елементы массива указывают на тотже объектв приложении файлы.
Работа программы:
Skolko studentov: 3
vvedite 1 imia: 1

vvedite 1 familiju: 2

vvedite 2 imia: 3

vvedite 2 familiju: 4

vvedite 3 imia: 5

vvedite 3 familiju: 6

6
6

у первого и у второго студента показывает фамилию 6, хотя должно быть:
2
4
Подскажите как это исправить?
заранее спасибо.

Приложение:
-----licnost.h------------
class licnost
{
private:
char* imia;
char* familija;

public:
void ustanovitDannyje(char* imia, char* familija);
char* getImia();
char* getFamilija();
};
--------licnost.cpp--------------
#include "licnost.h"

void licnost::ustanovitDannyje(char* imi, char* famili) {
imia = imi;
familija = famili;
}

char* licnost::getImia() {
return imia;
}

char* licnost::getFamilija() {
return familija;
}

----------student.h---------------
#include "licnost.h"
class student : public licnost {
private:
int nr;

public:
student(){};
student(char imia[25], char familija[25]);
char* ocenka(int vremia);
};

--------student.cpp---------------
#include "student.h"

student::student(char* imia, char* familija){
ustanovitDannyje(imia,familija);
}

char* student::ocenka(int time) {
char* rez;
return rez;
}

--------main.cpp-----------------
#include <cstdlib>
#include <iostream>
#include "student.h"

using namespace std;

int main(int argc, char *argv[])
{
int studSk;
char* tmpChar = new char[20];
char* tmpChar2 = new char[25];

cout<<"Skolko studentov: ";
cin>>studSk;
student* stud = new student[studSk];
for(int i = 0; i < studSk; i++) {
cout<<"vvedite "<<i+1<<" imia: ";
cin>>tmpChar;
cout<<endl<<"vvedite "<<i+1<<" familiju: ";
cin>>tmpChar2;
cout<<endl;
stud[i].ustanovitDannyje(tmpChar, tmpChar2);
}
cout<<stud[0].getFamilija()<<endl;
cout<<stud[1].getFamilija()<<endl;
cout<<stud[0].getImia();
system("PAUSE");
return EXIT_SUCCESS;
}

Обсуждение

Неизвестный
29.05.2009, 22:23
общий
это ответ
Здравствуйте, Станислав.
Надо понимать, что такое char*. Это не строка. Это указатель(адрес в памяти) где эта строка хранится. Поэтому в тех методах, где вы передаете char*
и сохраняете в переменные-члены класса. Вы сохраняете адрес на строку. Фактически адрес памяти выделенный оператором new. Но этот адрес используется чисто для буфера, куда Вы вводите имена и фамилии. В итоге по этому адресу располагаются последние введенные данные. Отсюда и такой результат. Это не правильный(ошибочный) подход.

Необходимо выделять память для строки, копировать ее и для всех классов использующих динамику обязательно определять деструктор, конструктор копирования и операцию присваивания.

Вот Ваша программа:
person.h
Код:

#pragma once

class person
{
public:
// Конструктор
person(const char* const firstName=0,const char* const lastName=0);
// Конструктор копирования
person(const person& l);
// Оператор присваивания
person& operator=(const person& l);
// Деструктор
virtual ~person();
const char* lastName() const;
const char* firstName() const;
private:
void dispose();
char* alloc(const char* const str);
char* _firstName;
char* _lastName;
};

person.cpp
Код:

#include <cstring>
#include "person.h"

const char* person::firstName() const
{
return _firstName;
}

const char* person::lastName() const
{
return _lastName;
}

person::~person()
{
dispose();
}

person::person( const char* const firstName,const char* const lastName )
:_firstName(alloc(firstName))
,_lastName(alloc(lastName))
{
}

person::person( const person& l ) :_firstName(alloc(l._firstName))
,_lastName(alloc(l._lastName))
{

}
char* person::alloc( const char* const str )
{
if(str)
{
size_t len=strlen(str)*sizeof(char)+1;
char* buffer=new char[len];
strcpy(buffer,str);
return buffer;
}
else return 0;
}

person& person::operator=( const person& l )
{
if(this!=&l)
{
dispose();
_firstName=alloc(l._firstName);
_lastName=alloc(l._lastName);
}
return *this;
}

void person::dispose()
{
if(_firstName)
{
delete[] _firstName;
}
if(_lastName)
{
delete[] _lastName;
}
}

student.h
Код:

#pragma once

#include "person.h"

class student : public person
{
public:
student(const char* const firstName=0, const char* const lastName=0,int rate=0);
int rate() const;
private:
int _rate;
};

student.cpp
Код:

#include "student.h"

student::student( const char* const firstName, const char* const lastName,int rate/*=0*/ )
:person(firstName,lastName)
,_rate(rate)
{

}

inline int student::rate() const
{
return _rate;
}

main.cpp
Код:

#include <limits>
#include <cstdlib>
#include <iostream>
#include "student.h"

using namespace std;

int main(int argc, char *argv[])
{
int studCount;
const size_t bufSize=25;
char* firstName = new char[bufSize];
char* lastName = new char[bufSize];

cout<<"Students count: ";
cin>>studCount;
cin.ignore(numeric_limits<streamsize>::max(),'\n');
student* students = new student[studCount];
for(int i = 0; i < studCount; i++) {
cout<<"Input "<<i+1<<" Firstname: ";
cin.get(firstName,bufSize);
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout<<"Input "<<i+1<<" Lastname: ";
cin.get(lastName,bufSize);
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout<<endl;
students[i]=student(firstName,lastName);
}
delete[] firstName;
delete[] lastName;
for(int i=0;i<studCount;++i)
{
cout<<students[i].firstName()<<' '<<students[i].lastName()<<endl;
}
delete[] students;
system("PAUSE");
return EXIT_SUCCESS;
}

5
Форма ответа