2016-11-29 3 views
0

В C++, как я могу успешно объединить классы в следующем примере?В C++ как мне успешно объединить классы в следующем примере?

Clock timer; 

std::cout << timer.getElapsedTime().inSeconds(); 
std::cout << timer.getElapsedTime().inMilliseconds(); 

Как написать код успешно?

class ElapsedTime 
{ 
private: 
    double _start; 

public : 
    ElapsedTime(double start) 
    { 
     _start = start; 
    } 
    double inSeconds() const 
    { 
     return (std::clock() - _start)/(double) CLOCKS_PER_SEC; 
    } 

    double inMilliseconds() const 
    { 
     return ((std::clock() - _start)/(double) CLOCKS_PER_SEC) * 1000; 
    } 
}; 


class Clock 
{ 
private: 
    std::clock_t _start; 
    double _duration; 

public: 

    Clock() 
    { 
     _start = std::clock(); 
    } 

    ElapsedTime getElapsedTime() const { 
     return ElapsedTime(_start); 
    } 

    double reset() 
    { 
     _duration = (std::clock() - _start)/(double) CLOCKS_PER_SEC; 
     _start = std::clock(); 
     return _duration; 
    } 

}; 

редактировать: сделал предложенные изменения от PM100

Хотя класс цепь еще возвращает значение, как .7e-05

и если я пытаюсь использовать сопзЬ следующим образом я получаю ошибка сегментации

ElapsedTime const& getElapsedTime() const { 
     return ElapsedTime(_start); 
+0

почему это не делают у inSeconds и inMIliseconds члены класса часы? – pm100

+0

Как я понял, вы хотите создать специальный класс, который сохранит некоторое значение времени и позволит вам получить время в секундах и в миллисекундах, да? – Pavel

+1

Когда вы закончите изучение этого вопроса, могу ли я предложить '#include '? – rwols

ответ

3

, если вы хотите, чтобы он работал таким образом, что нечетно. Вам нужен конструктор ElapsedTime, который принимает start

class ElapsedTime 
{ 
    double _start; 
    public : 
    ElapsedTime(double start) 
    { 
     _start = start; 
    } 

(использование _start в остальной части коды)

Тогда в часах

ElapsedTime getElapsedTime() const { 
     return ElapsedTime(start); 
    } 
+0

совершенно верно - слишком долго в C# земле. Исправлено: – pm100

+0

Спасибо за ваш полезный ответ ... хотя при компиляции кода цепочка классов возвращает что-то вроде .9e-05 ... Похоже, getElapsedTime() возвращает значение конструктора по умолчанию «ElapsedTime» ?? – puppy

+1

у вас теперь есть другой вопрос, задайте новый вопрос со всем отправленным кодом – pm100

1

Ваши переменные «запускающий» объявлен в рамках вашего класса Clock. Он не определен в рамках вашего класса ElapsedTime.

Почему вы не определяете метод ElapsedTime в своем классе Clock вместо использования 2 классов?

1

Если бы я писал этот код, я, вероятно, не сделал бы ElapsedTime своим классом. Я думаю, что я бы просто добавить getElapsedTimeInSeconds() и getElapsedTimeInMilliseconds() к Clock класса, например, так:

class Clock 
{ 
public: 
    Clock() 
    { 
     start = std::clock(); 
    } 

    double getElapsedTimeInSeconds() const 
    { 
     return (std::clock() - start)/(double) CLOCKS_PER_SEC; 
    } 

    double getElapsedTimeInMilliseconds() const 
    { 
     return getElapsedTimeInSeconds() * 1000; 
    } 

    double reset() 
    { 
     duration = (std::clock() - start)/(double) CLOCKS_PER_SEC; 
     start = std::clock(); 
     return duration; 
    } 

protected: 
    std::clock_t start; 

private: 
    double duration; 
}; 

, а затем основная функция:

int main(void) 
{ 
    Clock timer; 

    std::cout << timer.getElapsedTimeInSeconds() << std::endl; 
    std::cout << timer.getElapsedTimeInMilliseconds() << std::endl; 
} 
Смежные вопросы