Класса для измерения расстояния в футах и дюймах


Мое домашнее задание государства-вопрос:

Разработать класс для измерения расстояния в футах (должен быть типа int), дюймах (следует быть поплавок). Включают функции-члены, чтобы установить и получить атрибуты. Включают конструкторы. Разработать функции для добавления двух дистанциях.

Прототип функции sum:

Distance Sum(Distance d);

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

#include <iostream>
using namespace std;
class Distance
{
        private:
                int feet;
                float inch;
        public:
        Distance();
        Distance(int a,float b);
        void setDistance();
        int getFeet();
        float getInch();
        void distanceSum(Distance d);
};
int main()
{
        Distance D1,D2;
        D1.setDistance();
        D2.setDistance();
        D1.distanceSum(D2);
        return 0;
}
/*Function Definitions*/
Distance::Distance()
{
        inch=feet=0;
}
Distance::Distance(int a,float b)
{
        feet=a;
        inch=b; 
}
void Distance::setDistance()
{
        cout<<"Enter distance in feet";
        cin>>feet;
        cout<<endl<<"Enter inches:";
        cin>>inch;
}
int Distance::getFeet()
{
        return feet;
}
float Distance::getInch()
{
        return inch;
}
void Distance::distanceSum(Distance d)
{
        cout<<"feet="<<d.feet+feet<<endl;
        cout<<"inches="<<d.inch+inch<<endl;
}


38409
27
задан 31 января 2011 в 06:01 Источник Поделиться
Комментарии
4 ответа

При проектировании класса для вашей программы, будь то домашнее задание или приложение реального производства, необходимо всегда учитывать, насколько этот класс будет использовать и какие обязанности должны быть. Каждая функция и метод должен сделать одно дело/задача, и она должна быть отражена по методу название. Кроме того, вы хотите сохранить в согласованное легкий для чтения стиль написания кода, когда вы на самом деле начать писать код. С этих двух точек в виду, вот некоторые вещи, чтобы рассмотреть в вашем коде:


  • Расстояние::distanceSum делает две задачи здесь.

Это не только подведение футов и дюймов, но он печатает их, а также.


  • Ненужные преобразования типов.

По умолчанию расстояние() конструктор, есть неявное преобразование, потому что вы присваиваете 0 до поплавкового типа. Вы должны были получить предупреждение от компилятора. Рассмотрите возможность использования списка инициализации вот так:

Distance::Distance() : feet(0), inch(0.0)
{
}


  • Код не воспользоваться правильности строительства.

Какие параметры не предполагают, чтобы изменить? Какие методы будете изменять дистанцию класса? Например, расстояние: расстояние(в инт,флоат б) не меняется , А или б. Есть компилятор исполнения, которые обещают на использование const:

Distance::Distance(const int a, const float b)

Аналогичным образом:

void Distance::distanceSum(const Distance &d);


  • Противоречивые отступы и интервалы.

Рассмотреть возможность выделить под общественный методами: точно так же, как с частными:. Добавить пробелы, чтобы ваши задания, чтобы помочь удобочитаемости. например. ноги = а;


  • Никакого разделения модуля на файл.

класс расстояние , вероятно, должны быть в отдельном заголовок/файл реализации, а не класть все в один главный файл.


  • Комментарии ниндзя.

Комментарии? Какие комментарии? Точно. Рассмотрите возможность добавления блока комментариев в верхней части дистанции класса, который объясняет цель своего существования. Блок комментариев должен ответить на вопросы, как этот класс должен быть использован, и какие детали он абстрагируешься? Добавляя комментарий, чтобы уточнить, как ноги и члены дюймовый данные будут использоваться. Например, не ясно, если расстояние классу сохранении того же расстояния, но с разными единицами или это действительно предназначается, чтобы использоваться как единое целое. например. 6 футов 2 дюйма или 6 футов 72 дюймов?

С учетом вышеуказанных соображений, вот один из способов я бы рефакторинг кода:

В расстояние.файл заголовка H:

#ifndef DISTANCE_H
#define DISTANCE_H
class Distance
{
private:
// feet and inch is one unit.
// invariant: inch_ < 12.
int feet_;
float inch_;
public:
Distance(const int feet = 0, const float inches = 0.0);
void setDistance(const int feet, const float inches = 0.0);
int getFeet() const;
float getInch() const;

// returns this instance. Permits method chaining for Distance class.
Distance& Add(const Distance &d);
};
#endif

В реализации distance.cpp :

#include "distance.h"
Distance::Distance(const int feet, const float inches)
: feet_(feet + inches / 12), inch_(inches % 12)
{
}

void Distance::setDistance(const int feet, const float inches)
{
feet_ = feet + inches / 12;
inch_ = inches % 12;
}

int Distance::getFeet() const
{
return feet_;
}

float Distance::getInch() const
{
return inch_;
}

Distance& Distance::Add(const Distance &d)
{
setDistance(getFeet() + d.getFeet(), getInch() + d.getInch());

return *this;
}

Вот несколько основных вышеперечисленные изменения:


  • Расстояние больше не использует Кин/поток cout для явной ИО. Вы можете нажать этот код в главном.

  • определение класса и реализацию сейчас в их соответственно имени файлов.

  • Удален лишний определении конструктора с использованием параметров по умолчанию.

  • ноги и члены дюймовый данные используются совместно для представления измерений на расстояние. дюйм не может быть > 12, поскольку это означало бы достаточно для ног. Мы осуществляем это путем деления футах и дюймах на 12, когда установочные данные расстояния.

  • const используется, чтобы четко указать, что можно и не менять расстояние до объекта.

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

27
ответ дан 31 января 2011 в 07:01 Источник Поделиться

Кучу эти функции должны быть операторы. Вы кажется путать о цели добавления. Кроме того, использование имен std - это плохо. Вы также не предоставили каких-либо других операторов, хотя любой пользователь класса будет логичным предположить, что если вы можете добавить расстояние, вы можете добавить расстояние для текущего объекта, и что Вы тоже можете вычесть расстояния. Вы также не предоставил какой-либо входного контроля и правильности строительства.

class Distance
{
int feet;
float inch;
public:
// Constructors
Distance();
Distance(int a, float b);

// Getters
int getFeet() const;
float getInch() const;

// Operator overloads - arithmetic
Distance operator-(const Distance&) const;
Distance& operator-=(const Distance&);
Distance operator+(const Distance&) const;
Distance& operator+=(const Distance&);

// Create from console
static Distance getDistanceFromConsole();
};
// Operator overloads - I/O
std::ostream& operator<<(std::ostream&, const Distance&);

И реализация...

Distance::Distance() : feet(0), inch(0.0f) {}
Distance::Distance(int argfeet, float arginch) : feet(argfeet), inch(arginch) {
// Verify that we are actually in feet and inches.
// Not gonna write this code- dependent on the class invariants
// which were not explicitly specified (e.g., can have negative Distance?)
}
int Distance::getFeet() const {
return feet;
}
float Distance::getInch() const {
return inch;
}
Distance Distance::operator-(const Distance& dist) const {
Distance retval(*this);
retval -= dist;
return retval;
}
Distance& Distance::operator-=(const Distance& dist) {
feet -= dist.feet;
inches -= dist.inches;
// Verify values- e.g. that inches is less than 12
return *this;
}
Distance operator+(const Distance& dist) const {
Distance retval(*this);
retval += dist;
return retval;
}
Distance& operator+=(const Distance& dist) {
feet += dist.feet;
inches += dist.inches;
// More verification here.
}

std::ostream& operator<<(std::ostream& output, const Distance& dist) {
output << "Feet: " << dist.feet << "\n";
output << "Inches: " << dist.inches << std::endl; // flush when done.
return output;
}

Distance getDistanceFromConsole() {
int feet; float inch;
std::cout<<"Enter distance in feet";
std::cin>>feet;
std::cout<<endl<<"Enter inches:";
std::cin>>inch;
return Distance(feet, inch);
}

9
ответ дан 31 января 2011 в 10:01 Источник Поделиться

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

8
ответ дан 31 января 2011 в 06:01 Источник Поделиться

Комментарии на языке C++:

Предпочитаю списки инициализатора:

Distance::Distance()
:feet(0), inch(0)
{
// NOT THIS -> inch=feet=0;
}

Общие замечания кодирования:

Не сочетать функциональность:
Вы должны определить функцию, чтобы добавить расстояние объекты и никто их печатать. (DeadMG, что описанный выше).

void Distance::distanceSum(Distance d)
{
cout<<"feet="<<d.feet+feet<<endl;
cout<<"inches="<<d.inch+inch<<endl;
}

Также я вижу, что вы не нормализуют свои результаты. Вы можете получать 1 фут 300.05 дюймов. Когда состояние объекта меняется, когда один параметр перетекает в другой, вы должны нормализовать данные. Имеют явную функцию для этого и называть его каждый раз, когда изменения состояния:

private: void Normalize() { int eFeet = inches / 12; feet += eFeet; inches -= (eFeet * 12);}

Комментарии:

Но опять же, почему вы храните то, что на самом деле одно значение в двух разных переменных (футы и дюймы). Почему бы просто не хранить общее расстояние в дюймах (а затем выполните преобразование на пути в/из). Посмотрите на время Unix. Он просто считает секунды с начала эпохи. Все остальные значения рассчитываются исходя из этого.

5
ответ дан 31 января 2011 в 06:01 Источник Поделиться