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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2014, 18:29   #51
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Собственно вот:
Код:
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;

class Time
{
protected:
    int hour;
    int min;
    int sec;
    
public:
    void get_time ();
    void show_time ();
    Time& operator-- ();
    bool isHour () {return (hour >= 0 && hour < 24);}
    bool isMin () {return (min >= 0 && min < 60);}
    bool isSec () {return (sec >= 0 && sec < 60);}
};
//------------------------------------------------------
Time::Time& operator-- ()
{
   // body
    return *this;
}
//------------------------------------------------------
void Time::get_time ()
{
   //body
}
//----------------------------------------------------
void Time::show_time ()
{
    while (true)
    {
        Time t;
        cout << endl  << '\t' << '\t' << '\t' << '\t';
        if (t.hour<10) cout << '0';
        cout << t.hour  << " : ";
        if (t.min<10) cout << '0';
        cout << t.min  << " : ";
        if (t.sec<10) cout << '0';
        cout << t.sec;
        t--;
        Sleep (1000);
    }
    
}
//========================================================
int main ()
{
    Time t;
    t.get_time();
    t.show_time();
}
Скрин в builder 1.6!
Изображения
Тип файла: jpg Безымянный.jpg (28.0 Кб, 134 просмотров)

Последний раз редактировалось Stilet; 18.10.2014 в 11:26.
igoreshka3333 вне форума Ответить с цитированием
Старый 11.10.2014, 18:45   #52
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Вообще-то для каждой темы свой вопрос. Нужно было придумать хорошее название. Код и скрин, которые вы привели выше. В следующие раз так и делайте

По поводу проблемы, лично я пока не могу ответить. Занят. Попозже посмотрю. Может до этого ещё кто поможет
8Observer8 вне форума Ответить с цитированием
Старый 11.10.2014, 18:48   #53
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Хорошо )
igoreshka3333 вне форума Ответить с цитированием
Старый 11.10.2014, 21:55   #54
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Сейчас компилируется. Подумайте почему. Я просто внёс определение оператора внутрь класса.

Отмечу, что такого оператора у вас нет: t--;

У вас есть такой: --t;

Код:
#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;

class Time
{
protected:
    int hour;
    int min;
    int sec;

public:
    void get_time( );
    void show_time( );
    Time& operator--( )
    {
        return *this;
    }

    bool isHour( )
    {
        return (hour >= 0 && hour < 24 );
    }

    bool isMin( )
    {
        return (min >= 0 && min < 60 );
    }

    bool isSec( )
    {
        return (sec >= 0 && sec < 60 );
    }
};
//------------------------------------------------------

//Time::Time& operator--( )
//{
//    // body
//    return *this;
//}
//------------------------------------------------------

void Time::get_time( )
{
    //body
}
//----------------------------------------------------

void Time::show_time( )
{
    while ( true ) {
        Time t;
        cout << endl << '\t' << '\t' << '\t' << '\t';
        if ( t.hour < 10 ) cout << '0';
        cout << t.hour << " : ";
        if ( t.min < 10 ) cout << '0';
        cout << t.min << " : ";
        if ( t.sec < 10 ) cout << '0';
        cout << t.sec;
        --t;
        Sleep( 1000 );
    }

}
//========================================================

int main( )
{
    Time t;
    t.get_time( );
    t.show_time( );
}
Сразу не объяснишь проблему. Ответьте на вопрос. Это префиксный оператор или постфиксный:

Код:
    Time& operator--()
    {
        m_sec--;
        return *this;
    }

Последний раз редактировалось Stilet; 12.10.2014 в 23:22.
8Observer8 вне форума Ответить с цитированием
Старый 12.10.2014, 12:53   #55
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Сразу не объяснишь проблему. Ответьте на вопрос. Это префиксный оператор или постфиксный:

Код:
    Time& operator--()
        m_sec--;
    }
Это постфиксный! Я пробовал и тот и другой! Все та же ошибка
igoreshka3333 вне форума Ответить с цитированием
Старый 12.10.2014, 13:04   #56
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Цитата:
Это постфиксный!
А вот и 1 вам за это! Учите мат. часть!

По коду же видно, что сначала меняется состояние объекта, а потом возвращается ссылка на него. То есть в коде это будет выгдядеть так:
Код:
Time t;
++t;
Пока не напишете реализацию для постфикного, не отстану

Признаю, это моя вина, что я не с того начал:

Замените этот код:
Код:
Time::Time& operator-- ()
{
   // body
    return *this;
}
На этот:

Код:
Time& Time::operator-- ()
{
   // body
    return *this;
}
Исправляйте ошибку и выкладывайте код. Дальше будем улучшать. Я всё таки дал вам задание, и есть ещё опыт, которым я могу поделиться на этом примере. Добавьте оператор вывода на экран << для вашего Time по такому примеру:

main.cpp
Код:
#include <iostream>
#include "SecondsCounter.h"

int main( )
{
    SecondsCounter sc( 100 );

    for ( int i = 0; i < 10; i++ ) {
        ++sc;
        std::cout << sc << std::endl;
    }

    return 0;
}
SecondsCounter.h
Код:
#ifndef SECONDSCOUNTER_H
#define SECONDSCOUNTER_H

#include <ostream>

class SecondsCounter
{
public:

    SecondsCounter( int sec = 0 ) :
        m_sec( sec )
    {
    }

    int sec( ) const
    {
        return m_sec;
    }

    SecondsCounter &operator++( )
    {
        m_sec++;
        return *this;
    }

    SecondsCounter operator++( int )
    {
        SecondsCounter sc = *this;
        m_sec++;
        return sc;
    }

private:
    int m_sec;
};

std::ostream &operator<<( std::ostream &stream,
                          SecondsCounter sc )
{
    std::cout << sc.sec( );
}

#endif // SECONDSCOUNTER_H
Я исправил ошибку: зря сделал оператор << дружественной к классу. Оператор вывода на экран должен быть отдельно, то есть должен быть свободной функцией.

Объявление оператора дружественным я убрал:
Код:
private:
    friend std::ostream &operator<<( std::ostream &stream,
                                     SecondsCounter sc );
    int m_sec;
};
Дружественность означает, что из тела функции можно обращаться к private членам класса

Последний раз редактировалось Stilet; 12.10.2014 в 23:22.
8Observer8 вне форума Ответить с цитированием
Старый 12.10.2014, 15:48   #57
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Спасибо) Буду улучшать!

Так а ка же я буду иметь доступ к полям класса если функция не дружественная?
Код:
std::ostream &operator<<( std::ostream &stream,
                          SecondsCounter sc )
{
    std::cout << sc.sec( );
}

Последний раз редактировалось Stilet; 12.10.2014 в 23:21.
igoreshka3333 вне форума Ответить с цитированием
Старый 13.10.2014, 00:52   #58
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Ответ на вопрос. Не нужна дружественность, так как вам не нужны private члены. Вы все данные можете получить через интерфейс

А тепер внимательно и вдумчиво прочитайте следующий параграф из книги "Изучаем C++", автор А. Крупник:










Последний раз редактировалось 8Observer8; 13.10.2014 в 00:54.
8Observer8 вне форума Ответить с цитированием
Старый 13.10.2014, 23:48   #59
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Цитата:
Не нужна дружественность, так как вам не нужны private члены. Вы все данные можете получить через интерфейс
Вы имеете ввиду заголовочный файл?
igoreshka3333 вне форума Ответить с цитированием
Старый 14.10.2014, 00:28   #60
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Оператор вывода на экран не должен иметь доступ к закрытым членам объекта класса Time. Обязательно прочтите это правило: Правило 23: Предпочитайте функциям-членам функции, не являющиеся ни членами, ни друзьями класса

Можно конечно сделать оператор вывода другом, чтобы получить доступ к закрытой переменной внутри оператора, вот так: time.m_sec. Как в примере:
Код:
#include <iostream>
#include <string>

class Time
{
public:
    Time( int sec = 100 ) : m_sec( sec ) {}
    int sec() { return m_sec; }
    friend std::ostream &operator<<( std::ostream &stream, Time time );

private:
    int m_sec;
};

std::ostream &operator<<( std::ostream &stream, Time time )
{
    stream << time.m_sec;
    return stream;
}

int main()
{
    Time t;
    std::cout << t << std::endl;
    return 0;
}
Но зачем? Мы ведь можем получить секунды и через открытый интерфейс класса, вот так: time.sec(). Согласно правилу выше, оператор вывода на экран лучше сделать свободной функцией, а не другом (сделайте пространство имён, как в правиле). Пользователь вашего класса может захочет свой оператор вывода написать. Вот так лучше сделать:

Код:

#include <iostream>
#include <string>

class Time
{
public:
    Time( int sec = 100 ) : m_sec( sec ) {}
    int sec() { return m_sec; }

private:
    int m_sec;
};

std::ostream &operator<<( std::ostream &stream, Time time )
{
    stream << time.sec();
    return stream;
}

int main()
{
    Time t;
    std::cout << t << std::endl;
    return 0;
}
P.S. Список правил: ссылка

Покажите ваш класс Time, может там ещё какие-то ошибки есть

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
описать класс в с# volkodinocka Помощь студентам 0 09.11.2013 22:05
Описать класс С# NeoX_2011 Помощь студентам 1 19.03.2012 00:10
C# исправление ошибки. Описать класс, реализующий шестнадцатеричный счетчик PROkaZZZniK Помощь студентам 7 09.02.2012 16:29
Описать класс-родитель и класс-потомок. Delphi 7 Andrew_M Помощь студентам 0 15.01.2011 14:42
Описать класс. Telec Общие вопросы C/C++ 1 30.04.2010 18:43