Консультация № 191567
28.10.2017, 13:33
0.00 руб.
0 6 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос (простите много текста ):
есть два класса adress и list.
Объект класса list должен содержать массив объектов класса adress.
Описание структуры у adress:
Код:
class adress
{
private:
char name[100]; //имя
char street[100]; //улица
int house; //номер дома
public:
adress();
adress(char *pName, char *pStreet, int House);
~adress();
void Print(); //вывод информации об объекте на экран
void Input(); //ввод данных с клавиатуры
};

Методы реализовала так:
Код:

adress::adress()
{
strcpy_s(name, "no name");
strcpy_s(street, "no adress");
house = 0;
}

//инициализация полей класса Adress с помощью конструктора с аргументами
adress::adress(char *pName, char *pStreet, int House)
{
strcpy_s(name, pName);
strcpy_s(street, pStreet);
house = House;
}

//деструктор с объявлением действия удаления
adress::~adress()
{
cout << "Delete object..." << endl;
}

//функция вывода данных на экран
void adress::Print()
{
cout << "Information about object" << endl;
cout << "Name: " << name << endl;
cout << "Street: " << street << endl;
cout << "Number of house: " << house << endl;
}

//функция ввода данных класса пользователем с клавиатуры
void adress::Input()
{
cout << "Enter informaition about object" << endl;
cout << "Enter name: ";
gets_s(name); //используем функцию gets для ввода строки с пробелами
cout << "Enter street: ";
cin >> street;
cout << "Enter number of house: ";
cin >> house;
}

Здесь вроде все работает как требуется, но вот со вторым классом возникли проблемы.
Описание класса list:
Код:

class list
{
private:
int n; //размер массива
adress *p; //указатель на массив
public:
list(int a);
~list();
void Print(); //вывод данных на экран
int Size(); //возвращает размер массива
void PutAdress(int i, adress& adr); //функция заносит объект adr типа adress в i-й элемент массива
adress& GetAdress(int i); //функция возвращает объект типа adress из i-го элемента массива
};

Конструктор должен быть реализован так:
Код:
list::list(int a)
{
n = a;
p = new adress[n];
}

Деструктор обычный:
Код:
list::~list()
{
delete[]p;
cout << "Delete object of class list" << endl;
}

Функция возвращающая размер массива вроде так, хотя я до ее использования не дошла:
Код:
int list::Size()
{
return n;
}

А вот остальные функции никак не могу понять как реализовывать, пыталась вот так:
Код:
void list::Print() //вывод на экран, по заданию надо использовать функцию Print класса adress...
{
for (int i = 0; i < n; i++)
{
&adress::Print;
}
}

Код:
//функция заносит объект adr типа adress в i-й элемент массива
void list::PutAdress(int i, adress &adr)
{
int s = sizeof(adress);
*(p+(s*(i))) = adr;
}

Согласно условию каждое описание класса делаю в отдельном заголовочном файле, реализацию методов также в отдельных файлах .cpp, функция main отдельным .cpp, то есть собираю проект.
Все функции с таким набором аргументов, который требуется по условию.
main сделала так:
Код:
int main()
{
//создание объекта типа list размером 3 записи
list List(3);

//заполнение массива данными
for (int i = 0; i < 3; i++)
{
adress adr1("Ivanov Ivan Ivanovich", "Lenina", 60, "Tomsk");
List.PutAdress(i, adr1);
}

//вывод массива на экран
List.Print();
return 0;
}

Понимаю, что неправильно заполняю массив данными, но не могу понять как же добавлять остальные экземпляры класса. В задании написано: с помощью цикла for заполните массив данными, для этого в теле цикла создайте объект и проинициализируйте его, далее используйте функцию занесения объекта в i-й элемент массив (у меня это PutAdress)
И не понимаю, почему даже первый экземпляр не выводится на экран...
Прошу помощи

Обсуждение

давно
Старший Модератор
312929
1973
30.10.2017, 03:35
общий
Адресаты:
Попробуйте так:
Код:
void list::Print() //вывод на экран, по заданию надо использовать функцию Print класса adress...
{
for (int i = 0; i < n; i++)
{
p[i].Print();
}
}

//функция заносит объект adr типа adress в i-й элемент массива
void list::PutAdress(int i, adress &adr)
{
p[i] = adr;
}
давно
Старший Модератор
17042
808
02.11.2017, 06:14
общий
Адресаты:
Оформите ответ?
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
312929
1973
04.11.2017, 02:27
общий
Адресаты:
Оформите ответ?

Да, если автору вопроса подойдёт мой вариант.
давно
Старший Модератор
17042
808
04.11.2017, 08:09
общий
Адресаты:
Молчание - знак согласия. Полагаю, Ваше сообщение в мини-форуме автора вопроса устроило, так что смело можете его публиковать в качестве ответа.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Посетитель
401172
78
04.11.2017, 15:13
общий
Цитата: Коцюрбенко Алексей Владимирович
Попробуйте так:

Код :: выделить код
void list::Print() //вывод на экран, по заданию надо использовать функцию Print класса adress...
{
for (int i = 0; i < n; i++)
{
p[i].Print();
}
}
//функция заносит объект adr типа adress в i-й элемент массива
void list::PutAdress(int i, adress &adr)
{
p[i] = adr;
}


Спасибо, так и сделала в итоге) Все работает!
Простите, сразу не ответила, так как на сайте ответа не дождалась, были выходные и никто не отвечал
Приятно, что мне все-таки здесь опять помогли)
давно
Старший Модератор
312929
1973
05.11.2017, 01:18
общий
это ответ
Здравствуйте, pNod!

Функции Print и PutAdress класса list проще реализовать так:
Код:
void list::Print() //вывод на экран, по заданию надо использовать функцию Print класса adress...
{
for (int i = 0; i < n; i++)
{
p[i].Print();
}
}

//функция заносит объект adr типа adress в i-й элемент массива
void list::PutAdress(int i, adress &adr)
{
p[i] = adr;
}
Форма ответа