2017-03-16 9 views
-3

我想創建一個在英里,米,英尺,英寸和碼之間轉換的類。據說我的返回語句沒有存儲任何值,我被告知我不需要這麼多的函數,而且我的打印函數是空的,因爲我無法弄清楚要放入什麼內容,所以我長期以來一直使用它。我知道很多問題,我正在尋找指導。我一直在尋找大量的文檔,並沒有得到它 - 也許有人可以用外行的話來解釋。期待創建一個距離轉換類

#include <string> 
#include <iostream> 
using namespace std; 


class DistanceConverter { //Class name 
    public: 
     DistanceConverter() { //Default constructor 
      miles_ = 0; 
     } 
     DistanceConverter(double Miles) { //Overload constructor 
      miles_ = Miles; 
     } 
     //Miles mutators and accessors 
     void SetMilesToMeters(double Miles) { 
      miles_ = Miles * 1609.34; 
     } 
     double GetMilesFromMeters() { 
      return miles_; 
     } 

     void SetMilesToInches(double Miles) { 
      miles_ = Miles * 63360; 
     } 
     double GetMilesFromInches() { 
      return miles_; 
     } 


     void SetMilesToFeet(double Miles) { 
      miles_ = Miles * 5280; 
     } 
     double GetMilesFromFeet() { 
      return miles_; 
     } 

     void SetMilesToYards(double Miles) { 
      miles_ = Miles * 1760; 
     } 
     double GetMilesFromYards() { 
      return miles_; 
     } 

     //Yards mutators and accessors 
     void SetYardsToMiles(double Miles) { 
      miles_ = Miles/1760; 
     } 
     double GetYardsFromMiles() { 
      return miles_; 
     } 

     void SetYardsToFeet(double Miles) { 
      miles_ = Miles * 3; 
     } 
     double GetYardsFromFeet() { 
      return miles_; 
     } 

     void SetYardsToInches(double Miles) { 
      miles_ = Miles * 36; 
     } 
     double GetYardsFromInches() { 
      return miles_; 
     } 

     void SetYardsToMeters(double Miles) { 
      miles_ = Miles * 0.9144; 
     } 
     double GetYardsFromMeters() { 
      return miles_; 
     } 

     //Feet mutators and accessors 
     void SetFeetToMiles(double Miles) { 
      miles_ = Miles/5280; 
     } 
     double GetFeetFromMiles() { 
      return miles_; 
     } 

     void SetFeetToYards(double Miles) { 
      miles_ = Miles/3; 
     } 
     double GetFeetFromYards() { 
      return miles_; 
     } 

     void SetFeetToInches(double Miles) { 
      miles_ = Miles * 12; 
     } 
     double GetFeetFromInches() { 
      return miles_; 
     } 

     void SetFeetToMeters(double Miles) { 
      miles_ = Miles * 0.3048; 
     } 
     double GetFeetFromMeters() { 
      return miles_; 
     } 

     //Inches mutators and accessors 
     void SetInchesToMiles(double Miles) { 
      miles_ = Miles/63360; 
     } 
     double GetInchesFromMiles() { 
      return miles_; 
     } 

     void SetInchesToYards(double Miles) { 
      miles_ = Miles/36; 
     } 
     double GetInchesFromYards() { 
      return miles_; 
     } 

     void SetInchesToMeters(double Miles) { 
      miles_ = Miles * 0.0254; 
     } 
     double GetInchesFromMeters() { 
      return miles_; 
     } 

     void SetInchesToFeet(double Miles) { 
      miles_ = Miles/12; 
     } 
     double GetInchesFromFeet() { 
      return miles_; 
     } 

     //Meters mutators and accessors 
     void SetMetersToMiles(double Miles) { 
      miles_ = Miles/1609.34; 
     } 
     double GetMetersFromMiles() { 
      return miles_; 
     } 

     void SetMetersToYards(double Miles) { 
      miles_ = Miles/0.9144; 
     } 
     double GetMetersFromYards() { 
      return miles_; 
     } 

     void SetMetersToFeet(double Miles) { 
      miles_ = Miles/0.3048; 
     } 
     double GetMetersFromFeet() { 
      return miles_; 
     } 

     void SetMetersToInches(double Miles) { 
      miles_ = Miles/0.0254; 
     } 
     double GetMetersFromInches() { 
      return miles_; 
     } 

     //Print function 
     void PrintDistances() {} 

    private: 
     double miles_; 
}; 


int main() { 
    //Mile objects 
    DistanceConverter MileToMeter; 
    DistanceConverter MileToInch; 
    DistanceConverter MileToFeet; 
    DistanceConverter MileToYard; 
    //Yard objects 
    DistanceConverter YardToMile; 
    DistanceConverter YardToFeet; 
    DistanceConverter YardToInch; 
    DistanceConverter YardToMeter; 
    //Feet Objects 
    DistanceConverter FeetToMile; 
    DistanceConverter FeetToYard; 
    DistanceConverter FeetToInch; 
    DistanceConverter FeetToMeter; 
    //Inch objects 
    DistanceConverter InchToMile; 
    DistanceConverter InchToYard; 
    DistanceConverter InchToMeter; 
    DistanceConverter InchToFeet; 
    //Meter Objects 
    DistanceConverter MeterToMile; 
    DistanceConverter MeterToYard; 
    DistanceConverter MeterToFeet; 
    DistanceConverter MeterToInch; 

    //Miles to X conversions 
    MileToMeter.SetMilesToMeters(1); 
    cout<<"Miles to meters: " << MileToMeter.GetMilesFromMeters() << endl; 
    MileToMeter.PrintDistances(); 

    MileToInch.SetMilesToInches(1); 
    cout<<"Miles to inches: " << MileToInch.GetMilesFromInches() << endl; 
    MileToInch.PrintDistances(); 

    MileToFeet.SetMilesToFeet(1); 
    cout<<"Miles to feet: " << MileToFeet.GetMilesFromFeet() << endl; 
    MileToFeet.PrintDistances(); 

    MileToYard.SetMilesToYards(1); 
    cout<<"Miles to yards: " << MileToYard.GetMilesFromYards() << endl; 
    MileToYard.PrintDistances(); 

    //Yards to X conversions 
    YardToMile.SetYardsToMiles(10.5); 
    cout<<"Yards to miles: " << YardToMile.GetYardsFromMiles() << endl; 
    YardToMile.PrintDistances(); 

    YardToFeet.SetYardsToFeet(20); 
    cout<<"Yards to feet: " << YardToFeet.GetYardsFromFeet() << endl; 
    YardToMile.PrintDistances(); 

    YardToInch.SetYardsToInches(5.3); 
    cout<<"Yards to inches: " << YardToInch.GetYardsFromInches() << endl; 
    YardToMile.PrintDistances(); 

    YardToMeter.SetYardsToMeters(11); 
    cout<<"Yards to meters: " << YardToMeter.GetYardsFromMeters() << endl; 
    YardToMile.PrintDistances(); 

    //Feet to X conversions 
    FeetToMile.SetFeetToMiles(16); 
    cout<<"Feet to miles: " << FeetToMile.GetFeetFromMiles() << endl; 
    YardToFeet.PrintDistances(); 

    FeetToYard.SetFeetToYards(16); 
    cout<<"Feet to yards: " << FeetToYard.GetFeetFromYards() << endl; 
    FeetToYard.PrintDistances(); 

    FeetToInch.SetFeetToInches(2); 
    cout<<"Feet to inches: " << FeetToInch.GetFeetFromInches() << endl; 
    FeetToInch.PrintDistances(); 

    FeetToMeter.SetFeetToMeters(11); 
    cout<<"Feet to meters: " << FeetToMeter.GetFeetFromMeters() << endl; 
    FeetToMeter.PrintDistances(); 

    //Inches to X conversions 
    InchToMile.SetInchesToMiles(100); 
    cout<<"Inches to miles: " << InchToMile.GetInchesFromMiles() << endl; 
    InchToMile.PrintDistances(); 

    InchToYard.SetInchesToYards(15); 
    cout<<"Inches to yards: " << InchToYard.GetInchesFromYards() << endl; 
    InchToYard.PrintDistances(); 

    InchToMeter.SetInchesToMeters(55); 
    cout<<"Inches to meters: " << InchToMeter.GetInchesFromMeters() << endl; 
    InchToMeter.PrintDistances(); 

    InchToFeet.SetInchesToFeet(12); 
    cout<<"Inches to feet: " << InchToFeet.GetInchesFromFeet() << endl; 
    InchToFeet.PrintDistances(); 

    //Meter to X conversions 
    MeterToMile.SetMetersToMiles(1); 
    cout<<"Meters to miles: " << MeterToMile.GetMetersFromMiles() << endl; 
    MeterToMile.PrintDistances(); 

    MeterToYard.SetMetersToYards(100); 
    cout<<"Meters to yards: " << MeterToYard.GetMetersFromYards() << endl; 
    MeterToYard.PrintDistances(); 

    MeterToFeet.SetMetersToFeet(100); 
    cout<<"Meters to feet: " << MeterToFeet.GetMetersFromFeet() << endl; 
    MeterToFeet.PrintDistances(); 

    MeterToInch.SetMetersToInches(100); 
    cout<<"Meters to inches: " << MeterToInch.GetMetersFromInches() << endl; 
    MeterToInch.PrintDistances(); 

} 
+0

說不上爲什麼我總是被拒絕投票提問。 – JKOW12

+2

你錯過了一個具體的問題;我們無法回答沒有問題的事情。此外,你似乎有工作代碼;您可以發佈到http://codereview.stackexchange。com /爲改進您的代碼的建議 – vu1p3n0x

+0

對不起。我的具體問題是:1.如何使用較少的函數來做到這一點2.爲什麼返回語句不存儲任何值?並且忘記打印功能,因爲我認爲打印功能一旦解決了1和2就會變得更有意義。 – JKOW12

回答

1

我建議使用classstruct用於每個單元。

在您的設計中,沒有什麼能夠阻止我使用英尺數來呼叫英里到米。

通過使用類作爲單位類型,可以寫轉換方法(操作者),使得編譯將調用基於可變類型的適當的方法(在這種情況下,單元)。

例如:

struct Feet 
{ 
    unsigned int value; 
}; 
class Miles; 
class Meters; 
Feet Convert_From(const Meters& m); 
Meters Convert_From(const Miles& mi); 

編譯器會選擇基於可變類型的適當的轉換功能。

編輯1:構造
您也可以使用構造函數轉換:

struct Inches 
{ 
    unsigned int value; 
}; 
struct Feet 
{ 
    unsigned int value; 
    Feet(unsigned int f) 
    : value(f) 
    { ; } 
    Feet(const Inches& in) 
    { 
    value = in/12; 
    } 
}; 

//... 
Inches in; 
in.value = 24; 
Feet f(in); 
cout << f.value << endl; 
+0

由於舍入轉換,'double'似乎更適合'int'。 – Jarod42

+0

即使我喜歡強類型,那也不會減少方法數量。 – Jarod42

+0

我提出的解決方案不是爲了減少方法數量,而是爲了魯棒性和正確性。那麼,你爲什麼關心有多少種方法呢? (最有可能的是,每次轉換都會有一個) –

1

下面是如何用更簡單,更容易使用的模式來實現這一點的想法。

請注意,它僅執行Miles <-> Feet <-> Inches轉換,其餘(米,碼等)作爲練習留給您。

最值得注意的是它使用了static方法,因此您無需爲了執行簡單的轉換就初始化新對象。它也只有一個從中執行所有轉換的方法public

這允許更多的靈活性並且對用戶也更容易。

#include <iostream> 

enum class DistanceType 
{ 
    Unknown = 0, 
    Inches, 
    Feet, 
    Miles 
}; 

class DistanceConverter 
{ 
public: 

    static double Convert(double const value, DistanceType const from, DistanceType const to) 
    { 
     switch(from) 
     { 
     case DistanceType::Miles: 
      return ConvertMiles(value, to); 

     case DistanceType::Feet: 
      return ConvertFeet(value, to); 

     case DistanceType::Inches: 
      return ConvertInches(value, to); 

     default: 
      return value; 
     } 
    } 

protected: 

private: 

    static double ConvertMiles(double const value, DistanceType const to) 
    { 
     switch(to) 
     { 
     case DistanceType::Feet: 
      return (value * MilesToFeet()); 

     case DistanceType::Inches: 
      return (value * MilesToFeet()) * FeetToInches(); 

     default: 
      return value; 
     } 
    } 

    static double ConvertFeet(double const value, DistanceType const to) 
    { 
     switch(to) 
     { 
     case DistanceType::Miles: 
      return (value/MilesToFeet()); 

     case DistanceType::Inches: 
      return (value * FeetToInches()); 

     default: 
      return value; 
     } 
    } 

    static double ConvertInches(double const value, DistanceType const to) 
    { 
     switch(to) 
     { 
     case DistanceType::Miles: 
      return (value/FeetToInches())/MilesToFeet(); 

     case DistanceType::Feet: 
      return (value/FeetToInches()); 

     default: 
      return value; 
     } 
    } 

    static constexpr double MilesToFeet() { return 5280.0; }; 
    static constexpr double FeetToInches() { return 12.0; }; 
}; 

int main() 
{ 
    const double miles  = 5.0; 
    const double milesToFeet = DistanceConverter::Convert(miles,  DistanceType::Miles, DistanceType::Feet); 
    const double feetToInches = DistanceConverter::Convert(milesToFeet, DistanceType::Feet, DistanceType::Inches); 
    const double inchesToFeet = DistanceConverter::Convert(feetToInches, DistanceType::Inches, DistanceType::Feet); 
    const double feetToMiles = DistanceConverter::Convert(inchesToFeet, DistanceType::Feet, DistanceType::Miles); 

    std::cout << miles << " miles is: " << std::endl; 
    std::cout << "\t" << milesToFeet << " feet" << std::endl; 
    std::cout << "\t" << feetToInches << " inches" << std::endl; 
    std::cout << std::endl; 

    std::cout << feetToInches << " inches is: " << std::endl; 
    std::cout << "\t" << inchesToFeet << " feet" << std::endl; 
    std::cout << "\t" << feetToMiles << " miles" << std::endl; 
    std::cout << std::endl; 

    return 0; 
} 

其輸出

5 miles is: 
    26400 feet 
    316800 inches 

316800 inches is: 
    26400 feet 
    5 miles 

注意,我使用的第一個轉換的結果(英里英寸),以驗證所述第二結果(英寸到英里)。

+0

謝謝我明白你想要解釋什麼,但是我的介紹C++類尚未完成switch/case語句 – JKOW12

0

減少功能2 * n,使用一個主尺寸的廣告類,並提供輔助性的轉換,從和這個維度:

class Distance 
{ 
private: 
    double meters_; 
    Distance(double meters) : meters_(meters) {} 
public: 
    static Distance FromMeters(double meters) { return { meters }; } 
    static Distance FromMiles(double miles) { return { 1609.34 * miles }; } 
    static Distance FromInches(double inches) { return { 0.0254 * inches }; } 
    static Distance FromFeet(double feet) { return { 0.3048 * feet }; } 
    static Distance FromYards(double yards) { return { 0.9144 * yards} ; } 

    double ToMeters() const { return meters_; } 
    double ToMiles() const { return meters_/1609.34; } 
    double ToInches() const { return meters_/0.0254; } 
    double ToFeet() const { return meters_/0.3048; } 
    double ToYards() const { return meters_/0.9144; } 

}; 

然後用這種方式

std::cout << "Miles to inches: " << Distance::FromMiles(1).ToInches() << std::endl;