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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2014, 14:08   #1
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию Структура\Класс студент..Применение конструкторов.

Добрый день!

Создать структуру "Студент",содержащую следующие поля"
Фамилия - Произвольная длина(Си-строка)
Имя -Произвольная длина(Си-строка)
Отчество - Произвольная длина(Си-строка)
Год рождения и Группа.
2)Определить конструктор для инициализации полей структуры со значениями по умолчанию.Определить конструктор копирования и деструктор.Написать тестовый пример.
3)Написать интерфейсные функции доступа к полям класса(получить\задать значения поля)
4)Внести в конструктор и деструктор выдачу сообщений на экран,о том какая функция была вызвана.Модифицировать функцию main следующим образом
void main(){
cout<<"Вход в функцию main()";
тело main.
cout<<"Выход из функции main()";
}

Как я понял,в задании требуется чтобы я создал функции ввода студентов и их вывода на экран применяя конструкторы и деструкторы,а вот что писать в конструктор копирования я без понятия.

и конечно же куча ошибок(в коде отмечено)

Вот мои наработки:
Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>

using namespace std;

///class Student
struct Student
{
///public:
	
	void testfucn2();
    string familia[30];///фамилия
	string imia[30];///имя
	string otchestvo[30];///отчество
	int godrojd;///год рождения
    int gruppa;///группа
	
	

Student(string* familia, string* imia, string* otchestvo, int godrojd, int* gruppa)//Конструктор
{
	cout<<"Содержимое конструктора";
	imia=imia;
	familia=familia;
	otchestvo=otchestvo;
	godrojd=godrojd;
	gruppa=gruppa;
}

Student(Student &obj)//конструктор копирования
{
	cout<<"Конструктор копирования";
}

void get_vvod()
{
cout<<"Введите фамилию студента";
cin.getline(familia);  -Отсутствуют экземпляры перегруженная функция
	cout<<"Введите имя студента";
cin.getline(imia);  - Отсутствуют экземпляры перегруженная функция
	cout<<"Введите отчество студента";
cin.getline(otchestvo); - Отсутствуют экземпляры перегруженная функция
	cout<<"Введите год рождения студента";
	cin>>godrojd;
	cout<<"Введите группу студента";
	cin>>gruppa;
}

char show()
{
	cout<<"Фамилия:"<<' '<<"Имя:"<<' '<<"Отчество:"<<'  '<<"Год рождения:"<<' '<< "Группа:"<<' ';
}

~Student()//деструктор
{
	cout<<"Удаление...";
	delete(familia);
	delete(imia);
	delete(otchestvo);
	delete(godrojd);
	delete(gruppa);
}

//void StudentTest(Student s){

	///return s;
//}

}
s1;

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL,"Russian");
	cout<<"Вход в функцию";
	s1.get_vvod();
	s1.show();
	cout<<"Выход из функци";
	system("pause");
	return 0;
}
Otar4ik вне форума Ответить с цитированием
Старый 24.09.2014, 14:47   #2
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Цитата:
а вот что писать в конструктор копирования я без понятия
В вашей ситуации в конструкторе копирования нужно прописать копирование значений каждой переменной-указателя (у вас это строки - имя, фамилия, отчество) в новый объект.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 24.09.2014, 15:25   #3
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Спасибо сейчас исправлю
Otar4ik вне форума Ответить с цитированием
Старый 24.09.2014, 18:37   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Я нашёл ещё ошибку! Вы пишете:
Код:
string imia[30];///имя
Это массив из тридцати строк. Вот где было бы это правильно:
Код:
#include <string>
#include <iostream>

int main()
{
    std::string arr[30];

    arr[0] = "Hello";
    arr[1] = " my ";
    arr[2] = "computer!";

    std::cout << arr[0] << arr[1] << arr[2] << std::endl;

    return 0;
}
Надо так писать:
Код:
string name;
P.S. Там у вас ещё ошибки есть. Исправляйте и опять выкладывайте. Будем смотреть.

Последний раз редактировалось 8Observer8; 24.09.2014 в 18:43.
8Observer8 вне форума Ответить с цитированием
Старый 24.09.2014, 18:47   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

А у вас же в задании Си-строку надо писать, тогда везде замените string на char, вот так чтобы было:
Код:
char name[30];
8Observer8 вне форума Ответить с цитированием
Старый 24.09.2014, 18:48   #6
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Подправил функцию show.Но ошибки какие-то находит.Конструктор копирования вроде бы сделал..Но с ошибками

Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>

using namespace std;

class Student
///struct Student
{
public:
	
	void testfucn2();
    char familia[30];///фамилия
	char imia[30];///имя
	char otchestvo[30];///отчество
	int godrojd;///год рождения
    int gruppa;///группа
	
	

Student(char* familia, char* imia, char* otchestvo, int* godrojd, int* gruppa)//Конструктор
{
	cout<<"Содержимое конструктора";
	imia=imia;
	familia=familia;
	otchestvo=otchestvo;
	godrojd=godrojd;
	gruppa=gruppa;
}

Student(Student &obj)//конструктор копирования
{
	familia=obj.familia; - левый операнд должен быть левосторонним значением
	imia=obj.imia; -левый операнд должен быть левосторонним значением
	otchestvo=obj.otchestvo; -левый операнд должен быть левосторонним значением
	godrojd=obj.godrojd; 
    gruppa=obj.gruppa; 
}

void get_vvod()
{
    cout<<"Введите фамилию студента";
	cin>>familia;
	cout<<"Введите имя студента";
	cin>>imia;
	cout<<"Введите отчество студента";
	cin>>otchestvo;
	cout<<"Введите год рождения студента";
	cin>>godrojd;
	cout<<"Введите группу студента";
	cin>>gruppa;
}

char show()
{
    cout<<"\n Фамилия       : "<<familia;
    cout<<"\n Имя      : "<<imia;
    cout<<"\n Отчество      : "<<otchestvo;
    cout<<"\n Год рождения     : "<<godrojd;
    cout<<"\n Группа : "<<gruppa;
    cout<<"\n";
}

~Student()//деструктор
{
	cout<<"Удаление...";
	
}
}
s1; - Student: нет подходящего конструктора по умолчанию


int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL,"Russian");
	cout<<"Вход в функцию";
	s1.get_vvod();
	s1.show();
	cout<<"Выход из функции";
	system("pause");
	return 0;
}
Otar4ik вне форума Ответить с цитированием
Старый 24.09.2014, 19:35   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

ACE Valery

Цитата:
В вашей ситуации в конструкторе копирования нужно прописать копирование значений каждой переменной-указателя (у вас это строки - имя, фамилия, отчество) в новый объект.
А точно надо? - я не уверен (поправьте если не прав), но мне кажется, что если конструктор копирования вообще не объявлять, то он будет создан автоматически и будет вести себя именно так, как вы описали.

Если так - то надо пользоваться конструктором копирования по умолчанию, ну не стоит делать руками работу компилятора. Никогда. Это поле для ошибок и восприятие кода это тоже усложняет - если я увижу что у вашего класса есть конструктор копирования, то начну в него вчитываться, т.к. сразу заподозрю что он тут неспроста и где-то не подошел стандартный.

Цитата:
Но ошибки какие-то находит.Конструктор копирования вроде бы сделал..Но с ошибками
Код:
familia=obj.familia; - левый операнд должен быть левосторонним значением
	imia=obj.imia; -левый операнд должен быть левосторонним значением
	otchestvo=obj.otchestvo; -левый операнд должен быть левосторонним значением
Дак написано же какие ошибки. С-строки - это массивы символов. Ты берешь и присваиваешь один массив другому массиву, так нельзя делать.

Либо используй функции типа strcpy или memcpy.
Либо используй класс string.
Либо прочитай мой пост предыдущий и подумай нужен ли тебе вообще конструктор копирования.

Последний раз редактировалось Stilet; 26.09.2014 в 23:47.
rrrFer вне форума Ответить с цитированием
Старый 24.09.2014, 20:13   #8
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Код:
familia=obj.familia; - левый операнд должен быть левосторонним значением
	imia=obj.imia; -левый операнд должен быть левосторонним значением
	otchestvo=obj.otchestvo; -левый операнд должен быть левосторонним значением
Дак написано же какие ошибки. С-строки - это массивы символов. Ты берешь и присваиваешь один массив другому массиву, так нельзя делать.

Либо используй функции типа strcpy или memcpy.
Либо используй класс string.
Либо прочитай мой пост предыдущий и подумай нужен ли тебе вообще конструктор копирования.
Конструктор копирования нужен по заданию по лабораторной,то есть его надо определить.Хотя задам его просто так.Но в чём может быть ошибка?(в коде приведена)

Делал по книжке Герберта Шилдта,на основе его алгоритмов и примеров.

Код:
~Student()//деструктор
{
	cout<<"Удаление...";
	
}

}
s1;-----!!Student: нет подходящего конструктора по умолчанию!!

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL,"Russian");
	cout<<"Вход в функцию";
	s1.get_vvod();
	s1.show();
	cout<<"Выход из функци";
	system("pause");
	return 0;
}
Otar4ik вне форума Ответить с цитированием
Старый 24.09.2014, 20:22   #9
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Хотя задам его просто так.Но в чём может быть ошибка?(в коде приведена)
Я не написал в чем ошибка, потрудись ответ то прочитать. Массивы оператором = присваивать нельзя. Я написал как исправить.

Код:
s1;-----!!Student: нет подходящего конструктора по умолчанию!!
Тут вызывается конструктор Student(). Это же очевидно и про это в описании ошибки сказано.
У тебя нет такого конструктора - поэтому ошибка. Компьютер не придумает за тебя чем инициализировать фамилию, имя отчество и т.п., если они не заданы.
rrrFer вне форума Ответить с цитированием
Старый 24.09.2014, 21:22   #10
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Создать структуру "Студент",содержащую следующие поля"
Фамилия - Произвольная длина(Си-строка)
Имя -Произвольная длина(Си-строка)
Конструктор копирования вам и вправду будет нужен, так как вы будете динамически выделять память, а не в стеке, как у вас. Обратите внимание, что в вашем задании написано "Произвольная длина". Это значит, что пользователь не ограничен именем в 30 символов.

Посмотрите внимательно мой пример, попытайтесь понять (читая комментарии), а потом переделайте свой код и выкладывайте его опять для обсуждения

Код:
#include <string.h>
#include <iostream>

class Student
{
public:
    Student() :
        defaultSize( 30 ) // Это инициализация константы, которая задаёт размер строк поумолчанию
    {
        m_name = new char[defaultSize]; // Здесь получаем в наше распоряжение место для хранения 30 символов
    }

    void setName( const char *name, int size ) // Функция, с помощью которой пользователь сможет задать имя указанной длины
    {
        delete m_name; // Освобождаем память, в которой хранилось предыдущее имя
        m_name = new char[size]; // Выделяем память для имени с указанным размером
        strcpy( m_name, name ); // Копируем принятое имя во внутреннею переменную m_name
    }

    char *name()
    {
        return m_name;
    }

    ~Student()
    {
        delete m_name; // Освобождаем память, в котором хранилось имя
    }

private:
    char *m_name; // Этот указатель будет указывать на начало участка памяти, где будет храниться имя студента
    const int defaultSize; // Константа, которая хранит размер поумолчанию
};

int main()
{
    Student ivan;
    char *name = "Ivan";
    ivan.setName( name, strlen( name ) );
    std::cout << ivan.name() << std::endl;

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вероятность того, что студент забросит мяч в корзину, равна 0,4. Студент произвел 24 броска. Найти наивероятнейшее число попаданий now2 Помощь студентам 1 25.03.2014 17:48
структура и класс нона Помощь студентам 2 30.03.2012 07:42
класс Студент Alexander1205 Общие вопросы C/C++ 3 07.07.2011 23:06
Где скачать в электронном виде "ATL 8. Внутренняя структура и применение" graviator Обсуждение статей 3 07.04.2010 22:10
Применение конструкторов [Java] [CODER] Помощь студентам 2 28.03.2010 21:29