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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2014, 21:25   #11
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Вот так можно имя подлинее задать:
Код:
int main()
{
    Student ivan;
    char *name = "Ivan";
    ivan.setName( name, strlen( name ) );
    std::cout << ivan.name() << std::endl;

    char *longName = "Ivaaan";
    ivan.setName( longName, strlen( longName ) );
    std::cout << ivan.name() << std::endl;

    return 0;
}
Тоже самое, только конструктор копирования добавил:

Код:
#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
    }

    Student( const Student &student ) :
        defaultSize( 30 )
    {
        this->setName( student.name(), strlen( student.name() ) );
    }

    char *name() const
    {
        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;

    // Демонстрация конструктора копирования
    Student ivan2( ivan );
    std::cout << ivan2.name() << std::endl;

    return 0;
}

Последний раз редактировалось Stilet; 27.09.2014 в 00:00.
8Observer8 вне форума Ответить с цитированием
Старый 24.09.2014, 22:19   #12
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Снова компилятор ругается...Куча ошибок((((ругается где имя,фамилия и отчество - распространённая ошибка - -невозможно преобразовать "char *" в "char *[30]"
А завтра сдавать(((

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

using namespace std;

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

	Student()
	{
    familia = new char[30];
    strcpy(familia, "Иванов");
    imia = new char[30];
    strcpy(imia, "Иван");
    otchestvo = new char[30];
    strcpy(otchestvo, "Иванович");
    godrojd = new int(0000);
	gruppa = new int(10)
	}

Student(char* _familia, char* _imia, char* _otchestvo, int* _godrojd, int* _gruppa)//Конструктор
{
   familia = new char[strlen(_familia)];-невозможно преобразовать "char *" в "char *[30]"
    strcpy(familia, _familia);
    imia = new char[strlen(_imia)];-невозможно преобразовать "char *" в "char *[30]"
    strcpy(imia, _imia);
    otchestvo = new char[strlen(_otchestvo)];-невозможно преобразовать "char *" в "char *[30]"
    strcpy(otchestvo, _otchestvo);
    godrojd = new int(*_godrojd);
    gruppa = new int(*_gruppa);
}

Student(Student &obj)//конструктор копирования
{
	familia = new char[strlen(obj.familia)];---невозможно преобразовать "char *" в "char *[30]"
    strcpy(familia, obj.familia);---невозможно преобразовать "char *" в "char *[30]"
    imia = new char[strlen(obj.imia)];
    strcpy(imia, obj.imia);
    otchestvo = new char[strlen(obj.otchestvo)];
    strcpy(otchestvo, obj.otchestvo);-невозможно преобразовать "char *" в "char *[30]"
    godrojd = new int;
    godrojd = obj.godrojd;
	gruppa = new int;
	gruppa =obj.gruppa;
}

void ShowStudent()
{
    cout << "Фамилия: " << familia << endl;
    cout << "Имя: " << imia << endl;
    cout << "Отчество: " << otchestvo << endl;
    cout << "Год Рождения: " << godrojd << endl;
    cout << "Группа: " << gruppa;
}
 
void setfamilia(char* _familia)
{
    strcpy(familia, _familia);---невозможно преобразовать "char *" в "char *[30]"
}
 
void setimia(char* _imia)
{
    strcpy(imia, _imia);---невозможно преобразовать "char *" в "char *[30]"
}
 
void setotchestvo(char* _otchestvo)
{
    strcpy(otchestvo, _otchestvo);---невозможно преобразовать "char *" в "char *[30]"
}
 
void setgodrojd(int* _godrojd)
{
    *godrojd = *_godrojd;
}
 
void setgruppa(int* _gruppa)
{
    *gruppa = *_gruppa;
}

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

}


void _tmain(int argc, _TCHAR* argv[])- недопустимый "Student" с последующим "void" (возможно, отсутствует ";")
{---возвращаемый тип "wmain" должен быть "int", а не "Student"
	setlocale(LC_ALL,"Russian");
	cout<<"Вход в функцию";
	cout << "1-ый студент:" << endl;
    char* _familia = new char[30];
    char* _imia = new char[30];
    char* _otchestvo = new char[30];
    int _godrojd;
    int _gruppa;
    cout << "Введите фамилию: ";
    cin >> _familia;
    cout << "Введите имя: ";
    cin >> _imia;
    cout << "Введите отчество: ";
    cin >> _otchestvo;
    cout << "Введите год рождения: ";
    cin >> _godrojd;
    cout << "Введите группа: ";
    cin >> _gruppa;
    Student* firstStudent = new Student(_imia, _familia, _otchestvo, _godrojd, _gruppa);
---Student::Student(char *,char *,char *,int *,int *): невозможно преобразовать параметр 4 из "int" в "int *"
    Student* secondStudent = Student(firstStudent);           
 //Вызов конструктора копирования-----невозможно преобразовать "Student *" в "Student"
    cout << "2-ой студент:" << endl;
    cout << "Введите фамилию: ";
    cin >> _familia;
    cout << "Введите имя: ";
    cin >> _imia;
    cout << "Введите отчество: ";
    cin >> _otchestvo;
    cout << "Введите год рождения: ";
    cin >> _godrojd;
    cout << "Введите группа: ";
    cin >> _gruppa;
    firstStudent->setfamilia(_familia);
    firstStudent->setimia(_imia);
    firstStudent->setotchestvo(_otchestvo);
    firstStudent->setgodrojd(_godrojd);----Student::setgodrojd: невозможно преобразовать параметр 1 из "int" в "int *"
    firstStudent->setgruppa(_gruppa);  ----Student::setgodrojd: невозможно преобразовать параметр 1 из "int" в "int *"                                                    
    cout << "1-ый студент:" << endl;
    secondStudent->ShowStudent();
    cout << endl << "2-ой студент:" << endl;
    firstStudent->ShowStudent();
    delete _familia;
    delete _imia;
    delete _otchestvo;
    delete _godrojd;---нельзя удалять объекты, не являющиеся указателями
    delete _gruppa;---нельзя удалять объекты, не являющиеся указателями
    delete firstStudent;
	cout<<"Выход из функции";
	system("pause");
}

Последний раз редактировалось Stilet; 27.09.2014 в 00:03.
Otar4ik вне форума Ответить с цитированием
Старый 24.09.2014, 22:19   #13
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Ой я не заметил что выложили

Спасибоооо)сейчас посмотрю...
Otar4ik вне форума Ответить с цитированием
Старый 24.09.2014, 22:59   #14
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

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

using namespace std;

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

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

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

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


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


  void gruppa( const int *gruppa, int size ) // Функция, с помощью которой пользователь сможет задать имя указанной длины
    {
        delete m_gruppa; // Освобождаем память, в которой хранилось предыдущее имя
        m_gruppa = new int[size]; // Выделяем память для имени с указанным размером
        strcpy( m_gruppa, gruppa ); // Копируем принятое имя во внутреннею переменную m_name
    }
	 
	 Student( const Student &student ) :
        defaultSize( 30 )
    {
        this->setName( student.name(), strlen( student.name() ) );
    }
		defaultSize( 30 )
    {
        this->setSurame( student.surname(), strlen( student.surname() ) );
    }
		defaultSize( 30 )
    {
        this->setOtchestvo( student.otchestvo(), strlen( student.otchestvo() ) );
    }
		defaultSize()
    {
        this->setgodrojd( student.godrojd(), student.godrojd() );
    }
		defaultSize()
    {
        this->setgruppa( student.gruppa(), student.gruppa()  );
    }

    char *name() const
    {
        return m_name;
    }

	char *surname() const
    {
        return m_surname;
    }

	char *otchestvo() const
    {
        return m_otchestvo;
    }

	int *godrojd() const
    {
        return m_godrojd;
    }

	int *gruppa() const
    {
        return m_gruppa;
    }

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

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


int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL,"Russian");
	Student ivan;
    char *name = "Ivan";
	char *surname = "Ivanov";
	char *otchestvo = "Ivanich";
	int  *godrojd = "1988";
	int  *gruppa = "32";
    ivan.setName( name, strlen( name ) );
	ivan.setSurname( surname, strlen( surname ) );
	ivan.setOtchestvo( otchestvo, strlen( otchestvo ) );
	ivan.setgodrojd( godrojd, godrojd );
	ivan.setgruppa( gruppa, gruppa );
    std::cout << ivan.name() << std::endl;
	std::cout << ivan.surname() << std::endl;
	std::cout << ivan.otchestvo() << std::endl;
	std::cout << ivan.godrojd() << std::endl;
	std::cout << ivan.gruppa() << std::endl;
    // Демонстрация конструктора копирования
    Student ivan2( ivan );
    std::cout << ivan2.name() << std::endl;
	std::cout << ivan2.surname() << std::endl;
	std::cout << ivan2.otchestvo() << std::endl;
	std::cout << ivan2.godrojd() << std::endl;
	std::cout << ivan2.gruppa() << std::endl;
	system("pause");
	return 0;
}
Otar4ik вне форума Ответить с цитированием
Старый 25.09.2014, 06:32   #15
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

8Observer8
У тебя ошибки же в коде то.

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

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

Код:
Student( const Student &student ) :
        defaultSize( 30 )
    {
        this->setName( student.name(), strlen( student.name() ) );
    }
Ну вот например.

Код:
void main() {
  Student a; // вызов Student()
  Student b(a); // вызов Student(const Student&)
}
Программа упадет возможно. КОнструктор копирования вызовет strlen для неинициализированного объекта и будет определять длину мусора и искать там \0. Ясно, что все зависит от пятен на сонце уже?
rrrFer вне форума Ответить с цитированием
Старый 25.09.2014, 09:01   #16
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
У тебя ошибки же в коде то.
Ты память выделил, но не инициализировал ничем.
Спасибо! Да, это очень грубая ошибка! Я проворонил.

Otar4ik, исправьте ваш код, как у меня и выложете:
Код:
#include <string.h>
#include <iostream>

class Student
{
public:
    Student() :
        defaultSize( 30 )
    {
        this->setDefaultName();
    }

    void setName( const char *name, int size )
    {
        delete m_name;
        m_name = new char[size];
        strcpy( m_name, name );
    }

    Student( const Student &student ) :
        defaultSize( 30 )
    {
        this->setDefaultName();
        this->setName( student.name(), strlen( student.name() ) );
    }

    char *name() const
    {
        return m_name;
    }

    ~Student()
    {
        delete m_name;
    }

private:
    void setDefaultName()
    {
        m_name = new char[defaultSize];
        char *defaultName = "emptyName";
        strcpy( m_name, defaultName );
    }

private:
    char *m_name;
    const int defaultSize;
};

int main()
{
    Student ivan;
    char *name;
    std::cout << ivan.name() << std::endl;

    Student ivan2( ivan );

    return 0;
}

Последний раз редактировалось 8Observer8; 25.09.2014 в 09:05.
8Observer8 вне форума Ответить с цитированием
Старый 25.09.2014, 10:38   #17
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

При компиляции сразу выкинуло.
Изображения
Тип файла: jpg 4444.jpg (101.6 Кб, 145 просмотров)
Otar4ik вне форума Ответить с цитированием
Старый 25.09.2014, 11:15   #18
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Это вы мою запустили?

Цитата:
Сообщение от Otar4ik Посмотреть сообщение
При компиляции сразу выкинуло.
Я понял почему так случилось! Я совершил грубейшую ошибку! Дело в том, что strlen возвращает длину С-строки без учёта последнего терминального символа '\0' Исправьте мой код вот так:
Код:
this->setName( student.name(), strlen( student.name() ) + 1 );

Последний раз редактировалось Stilet; 27.09.2014 в 00:12.
8Observer8 вне форума Ответить с цитированием
Старый 25.09.2014, 11:50   #19
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Да ваш код запустил..я ещё к вечеру одну реализацию выложу,простое задание для меня оказалось трудноватым))
Otar4ik вне форума Ответить с цитированием
Старый 25.09.2014, 11:53   #20
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Даже не так, уберите эту единицу. Вот как нормально:
Код:
#include <string.h>
#include <iostream>

class Student
{
public:
    Student() :
        defaultSize( 30 )
    {
        this->setDefaultName();
    }

    void setName( const char *name, int size )
    {
        size++;
        delete m_name;
        m_name = new char[size];
        strcpy( m_name, name );
    }

    Student( const Student &student ) :
        defaultSize( 30 )
    {
        this->setDefaultName();
        this->setName( student.name(), strlen( student.name() ) );
    }

    char *name() const
    {
        return m_name;
    }

    ~Student()
    {
        delete m_name;
    }

private:
    void setDefaultName()
    {
        m_name = new char[defaultSize];
        char *defaultName = "emptyName";
        strcpy( m_name, defaultName );
    }

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;

    Student ivan2( ivan );

    return 0;
}
Цитата:
Сообщение от Otar4ik Посмотреть сообщение
Да ваш код запустил..я ещё к вечеру одну реализацию выложу,простое задание для меня оказалось трудноватым))
Эта задача, как видите, и для меня непростая!

Последний раз редактировалось Stilet; 27.09.2014 в 00:12.
8Observer8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где скачать в электронном виде "ATL 8. Внутренняя структура и применение" graviator Обсуждение статей 4 23.02.2025 16:46
Вероятность того, что студент забросит мяч в корзину, равна 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
Применение конструкторов [Java] [CODER] Помощь студентам 2 28.03.2010 21:29