Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
1

Использование char строк как членов класса

29.10.2019, 16:50. Показов 1763. Ответов 12

Author24 — интернет-сервис помощи студентам
Изначально всё получалось, смог вывести как надо возраст ( int age )
Но застрял на выводе имени ( char *cs_name; ) с таким типом данных опыта не имею
Подскажите как заставить код работать.
p.s. после рабочего варианта с int age код неоднократно менялся, не удивлюсь если где-то накосячил.


main.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// main.h
#include <iostream>
#include <string>
class Person
{
    char *cs_name; 
    int cs_age;
 
public:
    Person(){ //конструктор объекта по умолчанию (без аргументов)
        cs_name = 0;
        cs_age = 0;  
    };
    Person(char *name, int age) { //конструктор объекта, аргументы которого будут инициализировать все данные объекта
 
        cs_name = name ;
        cs_age = age ;
    };
        void Input() { //функцию ввода данных в объект с клавиатуры
    };
    void Print() { // функция для вывода данных на экран
    };
 
    
};

main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//main.cpp
#include<iostream>
#include<Windows.h>
#include"main.h"
 
using namespace std;
 
/*Person::Person()
{
    cs_name = 0;
    cs_age = 0; 
}
Person::Person(char *name, int age)
{
        
}*/
 
void Person::Input() //функцию ввода данных в объект с клавиатуры
{
    cin >> cs_name;
    cin >> cs_age;  
}
void Person::Print() //функцию вывода данных в объект с клавиатуры
{
    cout << "Имя: " << cs_name << " Возраст: " << cs_age << endl;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    Person x; //создание объекта через конструктор с параметрами
    x.Print();
    Person* person = new Person(); //выделение памяти под объект и его создание через конструктор по умолчанию
    person->Print();
    
    Person y;
    cout << "Введите через пробел имя, возраст и пол: "; //вывод через стандартный поток
    y.Input();
    y.Print();
    delete person; //освобождение памяти из под объекта
    system("pause");
    return 0;
}


Добавлено через 11 минут
Так же присутствует ошибка которую пока не получается исправить :
main.cpp(19,1): error C2084: функция "void Person::Input(void)" уже имеет текст реализации
main.cpp(24,1): error C2084: функция "void Person::Print(void)" уже имеет текст реализации
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2019, 16:50
Ответы с готовыми решениями:

Использование динамических массивов как членов класса
Здравствуйте, подскажите как правильно создать динамические массивы для данных класса stud. Я...

Правильное использование умных указателей, как членов класса
Допустим у нас есть класс Node, объекты которого могут хранить вложенные Node, как правильнее...

Массив объектов класса. Печать строк-членов класса.
подскажите, как распечатать строки? #include &quot;myString.h&quot; #include &lt;iostream&gt; #define stop...

Использование private-членов класса в сигнатуре методов
Делаю типовую задачу с собеседованием - рекурсивный разворот односвязного списка. Сама функция...

12
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
29.10.2019, 17:06 2
Лучший ответ Сообщение было отмечено Triglav86 как решение

Решение

Triglav86, могу предложить такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// main.h
#include <iostream>
#include <string>
class Person
{
    char * cs_name;
    int cs_age;
 
public:
    Person() { //конструктор объекта по умолчанию (без аргументов)
        cs_name = 0;
        cs_age = 0;
    }
    Person(char *name, int age) { //конструктор объекта, аргументы которого будут инициализировать все данные объекта
        cs_name = new char [strlen(name) + 1];
        strcpy(cs_name, name);
        cs_age = age;
    }
    ~Person(){
        delete[] cs_name;
    }
    void Input(); //функцию ввода данных в объект с клавиатуры
    void Print(); // функция для вывода данных на экран
 
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//main.cpp
 
#define _CRT_SECURE_NO_WARNINGS
 
#include<iostream>
#include<Windows.h>
#include"main.h"
 
using namespace std;
 
void Person::Input() //функцию ввода данных в объект с клавиатуры
{
    string str;
    cin >> str;
    cs_name = new char[strlen(str.c_str())+1];
    strcpy(cs_name, str.c_str());
    cin >> cs_age;
}
void Person::Print() //функцию вывода данных в объект с клавиатуры
{
    if (cs_name)
        cout << "Имя: " << cs_name << " Возраст: " << cs_age << endl;
    else
        cout << "Имя: " << "none" << " Возраст: " << cs_age << endl;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Person x((char*)"Петя", 25); //создание объекта через конструктор с параметрами
    x.Print();
    Person* person = new Person(); //выделение памяти под объект и его создание через конструктор по умолчанию
    person->Print();
 
    Person y;
    cout << "Введите через пробел имя, возраст: "; //вывод через стандартный поток
    y.Input();
    y.Print();
    delete person; //освобождение памяти из под объекта
    system("pause");
    return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от Triglav86 Посмотреть сообщение
уже имеет текст реализации
потому что в h-ке уже есть тело, хотя и пустое ({})
Есть вариант обозвать ее виртуальной, тогда функция заменится на нужную
1
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
29.10.2019, 18:34 3
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <iomanip>
#include <initializer_list>
#include <algorithm>
#include <functional>
#include <exception>
#include <numeric>
#include <string>
 
class Person {
public:
 
    Person(const char* name, int age) : name(copy(name)), age(age) {
    }
    virtual ~Person() {
        if (name != nullptr) {
            delete[] name;
        }
    }
    Person(const Person& o) : name(copy(o.getName())), age(o.getAge()) {
    }
    Person(Person&& o) noexcept : name(std::exchange(o.name, nullptr)), age(o.getAge()) {
    }
    Person& operator=(const Person& o) {
        if (this != &o) {
            if (this->name != nullptr) {
                delete[] name;
            }
            this->name = copy(o.getName());
            this->age = o.getAge();
        }
        return *this;
    }
    Person& operator=(Person&& o) noexcept {
        std::swap(this->name, o.name);
        std::swap(this->age, o.age);
        return *this;
    }
 
 
    const char* getName() const { return name; }
    const int getAge() const { return age; }
private:
    char* copy(const char* source) {
        if (source == nullptr) {
            return nullptr;
        }
        const size_t size = std::strlen(source) + 1;
        char* result = new char[size];
        std::memcpy(result, source, size);
        return result;
    }
 
    char* name;
    int age;
};
 
std::ostream& operator<<(std::ostream& out, const Person& p) {
    return out << "Person{name='" << p.getName() << "', age=" << p.getAge() << "}";
}
 
int main(int argc, char** argv) {
 
    // defines character buffer size
    const size_t BUFFER_SIZE = 1024; 
    // allocate character buffer size
    char* buffer = new char[BUFFER_SIZE] {0};
    // maximum line length will be buffer_szie - 1, because of trailing '\0'
    std::cout << "Enter name (max " << BUFFER_SIZE - 1 << " symbols): ";
    // read line, take BUFFER_SIZE symbols into buffer including trailing '\0'
    std::cin.getline(buffer, BUFFER_SIZE);
 
    // integer
    int age;
    std::cout << "Enter age: ";
    std::cin >> age;
 
 
    Person p(buffer, age);
 
    std::cout << p << std::endl;
 
    return 0;
}
Enter name (max 1023 symbols): Ivan
Enter age: 12
Person{name='Ivan', age=12}
1
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
30.10.2019, 12:35  [ТС] 4
Цитата Сообщение от lemegeton Посмотреть сообщение
.
Цитата Сообщение от liv Посмотреть сообщение
.
Большое спасибо! Сейчас буду ваш код изучать

Можете ещё подсказать, в этом же коде требуется реализовать : Пол (логический тип: 0 — муж., 1 — жен.) — int(bool)
Я тут даже логику понять не могу. Было бы просто bool, было бы всё ясно

Добавлено через 1 час 47 минут
Цитата Сообщение от liv Посмотреть сообщение
void Person::Print() //функцию вывода данных в объект с клавиатуры
{
* * if (cs_name)
* * * * cout << "Имя: " << cs_name << " Возраст: " << cs_age << endl;
* * else
* * * * cout << "Имя: " << "none" << " Возраст: " << cs_age << endl;
}
Не понимаю почему реализовано через if
и почему если if убрать выскакивает ошибка "нарушение прав доступа при чтении по адресу 0x0000000000000000"
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
30.10.2019, 12:42 5
Цитата Сообщение от Triglav86 Посмотреть сообщение
Не понимаю почему реализовано через if
Да потому и реализовано через if
Если класс создан без параметров, то значением полей будет что? Нули!
Когда пытаться вывести что-то по нулевому указателю, что будет?
1
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
30.10.2019, 12:43  [ТС] 6
Цитата Сообщение от Triglav86 Посмотреть сообщение
Было бы просто bool, было бы всё ясно
У меня только одно предположение, обычный задать возможность выбора пола при заполнении командной строки, вывести сообщение "Укажите ваш пол : цифра 0 - мужской, цифра 1 - женский"
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
30.10.2019, 12:45 7
Triglav86, когда вводите имя и возраст, добавьте ввод пола. Какие проблемы?
Вводите, как хотите. Хотите 0 или 1. Да пожалуйста, кто Вам это запретит?
Введенное значение, если хотите, можете свести к bool
1
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
30.10.2019, 12:56  [ТС] 8
liv Я толь-только вникать начал в программирование. У меня понимание такое - сказали делать так значит так и делаю. Но всё сводится к тому что одно и тоже задание можно по разному решать. Следуя методичке работу не решить, к примеру можно привести ошибку которая была у меня ранее:
Кликните здесь для просмотра всего текста
main.cpp(19,1): error C2084: функция "void Person::Input(void)" уже имеет текст реализации
main.cpp(24,1): error C2084: функция "void Person::Print(void)" уже имеет текст реализации

В методичке чётко написано что надо создать и в main.h и в main.cpp эти функции. Но из-за этого ошибки выскакивали.
И то каким образом можно эту ошибку обойти там ни слова нет.

Век живи - век учись
Спасибо этому форуму и тем кто помогает на нелегком пути к становлению программистом!
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
30.10.2019, 13:04 9
Цитата Сообщение от Triglav86 Посмотреть сообщение
Но всё сводится к тому что одно и тоже задание можно по разному решать
Вы молодец, раз пришли к такому пониманию...
Программирование - творческая работа. Путей реализации масса. Главное - понимать суть происходящего. А способ реализации подберется...
1
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
01.11.2019, 13:28  [ТС] 10
liv Не могли бы помочь ещё с одной частью задания. Сколько не бьюсь максимум что смог выжать это вывод 0 и 1 в консоль. Надо вывести пол студента


Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
cin >> cs_pol;
if (cs_pol % 2 == 0) {
    cs_pol = "Man";
}
else {
    cs_pol = "WoMan"; 
}
}


Планировал выполнить задание так: вводишь четное - Мужской пол, нечетное женский.
if (cs_pol % 2 == 0)

Но что-то идёт не так
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
01.11.2019, 21:06 11
Triglav86, cs_pol - целое? Разве можно целому присваивать строку?
Запишите туда число 0 или 1. При выводе анализируйте число. В зависимости от значения, выводите нужное слово
1
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
04.11.2019, 15:40 12
Разделите данные и их представление.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <iomanip>
#include <initializer_list>
#include <algorithm>
#include <functional>
#include <exception>
#include <numeric>
#include <string>
 
class Person {
public:
 
    Person(const char* name, int age, bool gender) : name(copy(name)), age(age), gender(gender) {
    }
    virtual ~Person() {
        if (name != nullptr) {
            delete[] name;
        }
    }
    Person(const Person& o) : name(copy(o.getName())), age(o.getAge()), gender(o.getGender()) {
    }
    Person(Person&& o) noexcept : name(std::exchange(o.name, nullptr)), age(o.getAge()), gender(o.getGender()) {
    }
    Person& operator=(const Person& o) {
        if (this != &o) {
            if (this->name != nullptr) {
                delete[] name;
            }
            this->name = copy(o.getName());
            this->age = o.getAge();
            this->gender = o.getGender();
        }
        return *this;
    }
    Person& operator=(Person&& o) noexcept {
        std::swap(this->name, o.name);
        std::swap(this->age, o.age);
        std::swap(this->gender, o.gender);
        return *this;
    }
 
 
    const char* getName() const { return name; }
    const int getAge() const { return age; }
    // false -- male, true -- female
    const bool getGender() const { return gender; }
private:
    char* copy(const char* source) {
        if (source == nullptr) {
            return nullptr;
        }
        const size_t size = std::strlen(source) + 1;
        char* result = new char[size];
        std::memcpy(result, source, size);
        return result;
    }
 
    char* name;
    int age;
    bool gender;
};
 
std::ostream& operator<<(std::ostream& out, const Person& p) {
    return out << "Person{name='" << p.getName() << "', age=" << p.getAge() << ", gender=" << (p.getGender() ? "female" : "male") << "}";
}
 
int main(int argc, char** argv) {
 
    // defines character buffer size
    const size_t BUFFER_SIZE = 1024;
    // allocate character buffer size
    char* buffer = new char[BUFFER_SIZE] {0};
    // maximum line length will be buffer_szie - 1, because of trailing '\0'
    std::cout << "Enter name (max " << BUFFER_SIZE - 1 << " symbols): ";
    // read line, take BUFFER_SIZE symbols into buffer including trailing '\0'
    std::cin.getline(buffer, BUFFER_SIZE);
 
    // integer
    int age;
    std::cout << "Enter age: ";
    std::cin >> age;
 
    // gender
    int gender;
    std::cout << "Enter gender (0 - male, 1 - female): ";
    std::cin >> gender;
 
 
    Person p(buffer, age, gender == 1);
 
    std::cout << p << std::endl;
 
    return 0;
}
1
2 / 2 / 0
Регистрация: 13.06.2019
Сообщений: 66
04.11.2019, 15:56  [ТС] 13
lemegeton Спасибо !
0
04.11.2019, 15:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2019, 15:56
Помогаю со студенческими работами здесь

Использование собственного класса строк
Здравствуйте, уважаемые господа. Есть реализация собственного класса строк: class MyString {...

Как полю класса типа char* присвоить значение типа *char
Проблема в строчке 46 (не пинайте сильно за формат кода и за говнокод) #include &quot;stdafx.h&quot; ...

Использование метода класса как функции в качестве типизированного аргумента в методе класса
Использование метода класса как функции в качестве типизированного аргумента в методе класса ...

Использование класса как переменной другого класса
Приветствую! Кто-нибудь может объяснить вопрос, заданный в теме? Как объявлять такую переменную,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru