Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175

Нужно ввести дату в формате dd.mm.yyyy - не работает присваивание

20.04.2015, 23:41. Показов 4564. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал свой класс date. Принцип работы прост. Просто нужно ввести дату в формате dd.mm.yyyy
Возникли следующие вопросы:
1) Почему не работает присваивание? Например date okey = "02.12.2014"
2) Нужно ли для этого перегружать operator=
3) Следует ли функцию bool is_num объявлять как дружественную(friend) класса? Ведь функция использует в качестве аргумента копию, мы ведь не передаем переменную по ссылке или по указателю.
4) Если смысл в таком небольшом классе в создании деструктора?
C++
1
2
3
4
5
6
7
8
9
10
11
//main.cpp
#include "date.h"
using namespace std;
 
int main()
{
    date any;
    date abv("abv");
    //date okey = "02.12.2014"; //error // conversion form 'const char[11]' to non-scalar type 'date' requested
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//date.h
#include <iostream>
#include <cstring>
using namespace std;
#ifndef DATE_H
#define DATE_H
 
class date
{
private:
    string is_date;
    string day, month, year;
 
public:
    date(string = "01.01.2000");
    void setdate();
    void printdate() const;
};
 
#endif // DATE_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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//date.cpp
#include "date.h"
 
bool is_num(string str)
{
    if(str.find_first_not_of("0123456789") > str.length()) return true;
    else return false;
}
 
date::date(string my)
{
    if(my.length() > 10) is_date = "01.01.2000";
    else if(my[2] != '.' || my[5] != '.') is_date = "01.01.2000";
    else
    {
        string d_day = my.substr(0,2);
        string d_month = my.substr(3,2);
        string d_year = my.substr(6,4);
 
        if(is_num(d_day) && stoi(d_day) < 32 && stoi(d_day) != 0) day = d_day;
        else day = "01";
        if(is_num(d_month) && stoi(d_month) < 13 && stoi(d_month) != 0) month = d_month;
        else month = "01";
        if(is_num(d_year) && stoi(d_year) != 0) year = d_year;
        else year = "2000";
 
        setdate();
    }
}
 
void date::setdate()
{
    is_date = day+"."+month+"."+year;
}
 
void date::printdate() const
{
    std::cout << "Is:" << is_date;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.04.2015, 23:41
Ответы с готовыми решениями:

Написать программу, которая предлагает пользователю ввести дату в формате YYYY MM DD и выводит в консоль, следующую за ней дату
Написать программу, которая предлагает пользователю ввести дату в формате YYYY MM DD и выводит в консоль, следующую за ней дату. ...

Написать программу, которая предлагает пользователю ввести дату в формате YYYY MM DD и выводит в консоль, следующую за ней дату
вот еще одно =) Написать программу, которая предлагает пользователю ввести дату в формате YYYY MM DD и выводит в консоль, следующую за...

Дана строка, содержащая дату в виде «dd.mm.yyyy». Определить дату через n дней
Что исправить нужно? #include&lt;iostream&gt; #include&lt;string&gt; using namespace std; struct date { int day; int month; int...

7
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
21.04.2015, 07:45
C++
1
 date okey = "02.12.2014";
У меня компилируется.
Это не операция присваивания, а инициализация.
Т.е. здесь вызывается конструктор date::date(string my).
Если же написать:
C++
1
2
 date okey;
okey = "02.12.2014";
То потребуется
C++
1
date& date::operator=(char*);
Функция bool is_num никакого отношения к классу date не имеет.
Она работает с string.

Деструктор не нужен. Вы самостоятельно с памятью не работаете.
0
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
21.04.2015, 18:25  [ТС]
zss,
C++
1
date okey = "02.12.2014";
Тем не менее не компилируется. Компилятор выводит следующую ошибку
C++
1
//conversion form 'const char[11]' to non-scalar type 'date' requested
Пользуюсь компилятором mingw, среда разработки qt. По 3 и 4 вопросу все понятно.
0
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
02.05.2015, 18:38  [ТС]
Неохота открывать новую тему так как пример тот же. Так я и не разобрался с проблемой инициализации через равно. Много и долго читал про перегрузку, но ничего не выходит. Помогите пожалуйста, не могу идти дальше пока не пойму тему перегрузок
Как сделать что бы работало:
C++
1
date t = "12.12.2000";
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//main.cpp
#include "date.h"
 
using namespace std;
 
int main()
{
    date any("12.12.2014");
    cout << any;
 
    // не работает ниже, сделал перегрузку oparator = (const char *)
    // выдает ошибку: conversion form 'const char[11]' to non-scalar type 'date' requested
    // date t = "12.12.2000";
 
    // ниже работает без перегрузки oparator = (char *)
    date p;
    p = "12.12.2014";
    return 0;
}
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
//date.h
#ifndef DATE_H
#define DATE_H
#include <iostream>
using namespace std;
 
 
class date
{
private:
    string is_date;
    static const unsigned size;
    static const string const_date;
 
    friend ostream & operator<<(ostream &, const date &);
    friend istream & operator>>(istream &, date &);
public:
    date();
    date(string);
    void setdate(string & my);
 
    void entercorrectly() const;
    void printdate() const;
 
   // date & operator= (char *);
    date & operator= (const char *);
    bool operator==(string &) const;
    bool operator==(date &) const;
//    int & operator[](int); // для не константных массивов - не имеет смысла, строка всегда будет const char *
    int operator[](int) const;
};
 
#endif // DATE_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
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
97
98
99
100
//date.cpp
#include "date.h"
bool is_num(string str)
{
    if(str.find_first_not_of("0123456789") > str.length()) return true;
    else return false;
}
 
const unsigned date::size = 10; // length of date
const string date::const_date = "01.01.2000"; // the date seted by constant
 
date::date()
{
    is_date = const_date;
}
 
date::date(string my)
{
    date();
    setdate(my);
}
 
void date::setdate(string & my)
{
    if(my.length() > size) entercorrectly();
    else if(my[2] != '.' || my[5] != '.') entercorrectly();
    else
    {
        string d_day = my.substr(0,2);
        string d_month = my.substr(3,2);
        string d_year = my.substr(6,4);
 
        if(is_num(d_day) && stoi(d_day) < 32 && stoi(d_day) != 0)
            if(is_num(d_month) && stoi(d_month) < 13 && stoi(d_month) != 0)
                if(is_num(d_year) && stoi(d_year) != 0)
                    is_date = d_day+"."+d_month+"."+d_year;
    }
}
 
void date::entercorrectly() const
{
    cout << "You entered incorrectly the type of date! dd.mm.yyyy" << endl;
}
 
void date::printdate() const
{
    std::cout << "Is:" << is_date;
}
/*
date & date::operator = (char * str)
{
    date any = string(str);
    return *this;
}*/
 
date & date::operator = (const char * str)
{
    // как правильно перегрузить????
    return *this;   
}
 
bool date::operator == (string & any) const
{
    if(is_date == any) return true;
    else return false;
}
 
bool date::operator == (date & any) const
{
    unsigned count = 0;
    for(unsigned i = 0;i<size;i++)
        if(is_date[i] == any[i]) count++;
    if(count == size) return true;
    else return false;
}
/*
int & date::operator[](int index)
{
    return this[index];
}
*/
 
int date::operator [](int index) const
{
    return is_date[index];
}
 
istream & operator>>(istream & input, date & a)
{
    input >> a.is_date;
    date temp(a);
    for(unsigned i = 0;i<date::size;i++) if(!(temp[i] == a[i])) a.is_date = date::const_date;
    return input;
}
 
ostream & operator<<(ostream & output, const date & a)
{
    output << a.is_date;
    return output;
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.05.2015, 19:00
Цитата Сообщение от zss Посмотреть сообщение
Это не операция присваивания, а инициализация.
Т.е. здесь вызывается конструктор date::date(string my).
не совсем:

C++
1
date okey = "02.12.2014";
преобразуется в:

C++
1
date okey(date("02.12.2014"));
то бишь, задействуется конструктор копии.
причем, нужно иметь ввиду - компилятор оптимизирует,
и конструктор копии будет не наблюдаемым.

отсюда возникает иллюзия,
что сразу запускается конструктор с параметром.

иллюзию легко развеять, если не забывать:
сначала компилятор проверяет синтаксис, и только потом оптимизирует,
а значит без конструктора копии код работать не будет:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
 
struct example
{
    example(int v){}
private:
    example(const example& rhs);
    
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    // error: ‘example::example(const example&)’ is private
    example ex = 10;
}
http://rextester.com/GRJFD53450
2
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
02.05.2015, 20:16  [ТС]
hoggy, Добавил конструктор копирования. Перечитал свою книжку, а там лишь пишется что конструктор копирования это, а ни каких подробных примеров и объяснений нету, мол через пару уроков увидите.
C++
1
2
3
4
date::date(const date & my)
{
    this->is_date = my.is_date;
}
Только вот с перегрузкой оператора равно беда. Помогите, что бы я наконец то добрался до свей цели
C++
1
date okey = "02.12.2014";
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.05.2015, 20:23
Лучший ответ Сообщение было отмечено kol как решение

Решение

Цитата Сообщение от kol Посмотреть сообщение
Только вот с перегрузкой оператора равно беда. Помогите, что бы я наконец то добрался до свей цели
вам же уже выше сказали:
вы хотите перегрузить operator=

однако это - оператор присвоения.
присвоить новое значение можно только чему то, что уже было создано и реально существует.

однако в вашей строке:

C++
1
date okey = "02.12.2014";
происходит создание объекта okey.
то есть, это не присвоение, а конструирование.

сравните:

C++
1
2
3
4
5
6
some obj(10); //<--- создали объект с параметром 10
//создание объекта - это вызов конструктора объекта
// в данном случае с параметром 10
 
obj = 20; //<--- присвоили существующему объекту новое значение 20
// операция присвоение - это запуск operator=
и

C++
1
2
3
4
5
6
7
8
9
10
some obj = 10; //<--- раньше объекта ещё не существовало
// эта форма записи эквивалентна: 
// some obj( some(10) );
 
// теперь obj существует
 
obj = 20; //<--- теперь это уже присвоение: 
//изменение состояния уже существующего объекта
 
// операция присвоение - это запуск operator=

таким образом, если объект ещё не существует, то символ '=' запустит конструктор.
а если уже существует, только тогда будет запущен operator=
1
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
02.05.2015, 20:43  [ТС]
hoggy, Большое спасибо! Я какой то нулевый, надо ещё раз перечитать. Всего то три строчки кода. И благодарю что не написали готовый ответ, когда сделано самим методом проб и ошибок, запоминается на долго!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.05.2015, 20:43
Помогаю со студенческими работами здесь

Ввести дату в формате DD.MM.YYYY и перевести в DD Month Year
Помогите пожалуйста написать на языке Си (С++ и прочие не предлагать) написать программу, которая выводит на экран дату в формате...

Нужно создать объект validation в ячейке, позволяющий вводить дату-время в формате "dd.mm.yyyy hh:mi".
Нужно создать объект validation в ячейке, позволяющий вводить дату-время в формате &quot;dd.mm.yyyy hh:mi&quot;. Что - то вроде ...

Вывести дату в формате dd.mm.yyyy
Помогите, пожалуйста, с заданием. Необходимо создать запрос, возвращающий список сотрудников из таблицы с указанием даты рождения в...

Взять дату с инпута в формате dd/mm/yyyy
добрый день, как дату взять с инпута в формате dd/mm/yyyy, у меня берется в формате mm/dd/yyyy var departure =...

Как в представлении вернуть дату в формате dd/mm/yyyy?
Здравствуйте!!! Есть у меня представление в базе данных. В этом представлении есть поля &quot;дата начала ремонта&quot; и &quot;дата конца...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru