Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
#1

Ошибки в структуре Date. Каким-то образом перетекают значения между екземплярами. - C++

18.07.2012, 00:55. Просмотров 409. Ответов 5
Метки нет (Все метки)

У меня получилась вот такая структура:
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//#include "stdafx.h"
#include "Date_class.h"
void main(){
 
    Date_class K(22,13,82);
    K.print();
    K.setData(22,8,82);
    K.print();  
    Date_class T(35325432);
    T.print();
    K.print();
    Date_class Bum;
    Bum.print();
    Date_class B(K);
    B.print();
    system("pause");
}
Date_class.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
#include "stdafx.h"
#pragma once
class Date_class
{
time_t seconds;
tm* timeinfo;
    bool chekchange(int &,int &,int &);
    void copyDate(int &,int &,int &);
public:
    Date_class();
    Date_class(int);
    Date_class(int,int,int);
 
    tm* getData();
    const time_t&  getTime();
    void setData();
    void setData(int,int,int);
    void setData(tm*);
    void setTime(int);
    void setTime(time_t);
    void setTime(tm*);
    tm * newtm();
    time_t PresentTime();
    void print();
    
    ~Date_class();
};
Date_class.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
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
#include "Date_class.h"
Date_class::~Date_class()
{// delete timeinfo;
    }
    Date_class::Date_class(){
        setTime(PresentTime());
        setData();
    }
    Date_class::Date_class(int seconds){
        setTime(seconds);
        setData();
    }
    Date_class::Date_class(int day,int monce,int year){
        setTime(PresentTime());
        setData();
        setData(day,monce,year);
    }
    tm* Date_class::getData(){
        return timeinfo;
    }
    const time_t& Date_class::getTime (){
        return this->seconds;
    }
    void Date_class::setData(){
        this->timeinfo=localtime(&getTime());
    }
    void Date_class::setData(tm *timeinfo){
        *this->timeinfo=*timeinfo;
    }
    void Date_class::copyDate(int &day,int &monce,int &year){
        this->timeinfo->tm_mday=day;
        this->timeinfo->tm_mon=monce;
        this->timeinfo->tm_year=year;
        setTime(timeinfo);
    }
    void Date_class::setData(int day,int monce,int year){
        tm *tmp=newtm();
 
        copyDate(day,monce,year);
        if(chekchange(day,monce,year)){
        delete tmp; return;}
        else{cout<<"This date does not exist, we use the current date.\n";
        setData(tmp); setTime(timeinfo);
        delete tmp; return;} }
    
    tm * Date_class::newtm(){
    tm *tmp=new tm;  *tmp=*timeinfo;
    return tmp;
    }
 
    bool Date_class::chekchange(int &day,int &monce,int &year){
        if ((timeinfo->tm_mday==day)&&(timeinfo->tm_mon==monce)&&(timeinfo->tm_year==year))
        return true; else return false;
    }
    time_t Date_class::PresentTime(){
        return time(NULL);
    }
 
    void Date_class::setTime(int seconds){
        this->seconds=seconds;
    }
    void Date_class::setTime(time_t seconds){
        this->seconds=seconds;
    }
    void Date_class::setTime(tm* timeinfo){
        this->seconds=mktime(timeinfo);
    }
    void Date_class::print(){
    //setData();
        cout<<"Current Datetime:"<<asctime(this->timeinfo)<<endl;
    }
stdafx.h
C++
1
2
3
4
5
6
#pragma once    
#include <iostream>
#include <ctime>
#include <time.h>
 
using namespace std;
Если запустить программу как есть то на экране появится это:
Ошибки в структуре Date. Каким-то образом перетекают значения между екземплярами.
как есть означает закомментированная строка 69 в Date_class.cpp - setData() метод который заново определяет структуру tm в экземпляре класса в зависимости от значения переменной time_t seconds;
которая в свою очередь означает количество секунд, по моему от 70-го года, до настоящего момента.

С другой стороны если эту функцию все таки запускать(что само по себе не правильно, зачем она нужна в принте) То все работает как надо, по крайней мере внешне.
Вот так:
Ошибки в структуре Date. Каким-то образом перетекают значения между екземплярами.

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

Помогите разобраться, что и как нужно поменять, чтоб было все грамотно и все работало как надо.
Зы писал сам с нуля.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2012, 00:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибки в структуре Date. Каким-то образом перетекают значения между екземплярами. (C++):

Составить алгоритм и программу, которая вводит значения a,b,c, сравнивает их между собой и перераспределяет таким образом...
Всем добрый вечер. Нужна небольшая помощь Вообщем такая задача Составить...

Каким образом можно получить код ошибки принтера HP LJ 1020
Принтеры при неисправности выдают код ошибки, если есть окно индикации, то на...

Каким образом передаются значения из функции и процедуры в основную программу
??????

Ошибка чтения значения!!! Уже не знаю каким образом получить значение?(((
Вот такой простой текст запроса , не могу получить значение!!! Подскажите...

DataGridView: можно ли каким-либо образом вставлять значения напрямую в представление
Здравствуйте. Извиняюсь, но такую тему найти на форуме не смог. Хотя похожих...

Каким образом узнать площадь параллелограмма через векторы, если неизвестен угол между ними?
По условию имеются два вектора - M и N, где |M| = 3, |N| = 5, а угол (M, N) =...

5
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
18.07.2012, 01:02 #2
не совсем понял в чем конкретно там у вас проблемы. вот что вижу я:
у вас мембер timeinfo - это указатель. зачем вы так сделали - хз. но из-за этого и перетекание значений, и кривая работа деструктора. потому что конструктор копирования по умолчанию копирует значение указателя. потом деструкторы двух разных объектов пытаются удалить одно и то же. сильно не смотрел, подозреваю, что есть еще и утечки этих самих динамических tm объектов.
в общем есть смысл вместо tm* timeinfo; использовать tm timeinfo;
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
18.07.2012, 01:17  [ТС] #3
Цитата Сообщение от DU Посмотреть сообщение
у вас мембер timeinfo - это указатель.
Ну да, если он не будет указателем то мне не нужен и деструктор.

Цитата Сообщение от DU Посмотреть сообщение
потому что конструктор копирования по умолчанию копирует значение указателя
А можно как-то разъяснить этот момент, он ведь должен создавать абсолютно новый экземпляр, а значит (я так думаю)новый указатель и в конструкторе по умолчанию есть свои методы инициализации.

И вообще, что это за "конструктор копирования"?
0
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
18.07.2012, 01:25 #4
ну за деталями лучше в книжках почитать.
вкратце: в классе есть мембер указатель.
в одном объекте этот укзазатель указывает на адрес A.
создаем второй объект из первого. все мемберы второго объекта будут равны всем мемберам первого объекта, а значит указатель второго объекта тоже будет указывать на адрес A.
Потом вызываются деструкторы первого и второго объектов. И в каждом идет удаление того, что находится по адресу A - а это ошибка. Делете можно звать только один раз.

Избавтесь от указателя в своем классе уйдет куча проблем.
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
18.07.2012, 17:32  [ТС] #5
Скажите пожалуйста как в этой конструкции
C++
1
2
3
4
5
 
   K.print();  
    Date_class T(35325432);
    T.print();
    K.print();
Мы создаем "второй объект из первого."? В начале К=82 году, по концовке =71-му.

Цитата Сообщение от DU Посмотреть сообщение
Избавтесь от указателя в своем классе уйдет куча проблем.
Избавится конечно можно, и может быть я в итоге так и сделаю, (если не найду решения с указателями). Но если всегда идти по пути наименьшего сопротивления, то никогда нечего нового не узнаешь.

Добавлено через 15 часов 48 минут
Все разобрался сам. Основная ошибка в методе setData()
Я присваиваю адрес указателя возвращаемой функцией localtime(); в сам объект, и работаю с этим адресом.
Это основная ошибка, остальные производные, также куда-то потерял выделение памяти под указатель член класса timeinfo.
Ну и в самую последнюю очередь можно переопределить конструктор копирования, чтоб корректно копировал поля, и предотвратить ошибку деструктора, при инициализации экземпляра объекта Date другим экземпляром этого объекта.
0
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
18.07.2012, 18:03 #6
основная ошибка - усложнение класса на ровном месте за счет того, что вмето обычного объекта вы используете динамический. то, что я вам советовал - это не здравый смысл, а не поход по пути наименьшего сопротивления. чем проще код, тем меньше с ним проблем. это один из показателей качества кода. к тому же для полного счастья еще и оператор = нужно сделать правильно.
0
18.07.2012, 18:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2012, 18:03
Привет! Вот еще темы с решениями:

Каким образом можно настроить автозаполнение в mysql значения внешнего ключа в другой таблице?
Допустим, есть две таблицы. В одной первичный ключ объявлен в качестве...

Каким образом в Common Lisp можно возвращать более одного значения, не используя объекты-контейнеры?
Каким образом в Common Lisp можно возвращать более одного значения, не...

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

Каким символом и каким образом отобразить пробел в document.write
Вот код var mailExample = /^(+)@((+\.)+{2,6})$/; var Str =...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru