2012-07-19 17 views
5

मैं मीटर और किलोमीटर के लिए इकाइयों को बनाने की कोशिश कर रहा हूं। मैं फिर तदनुसार उन्हें योग और रूपांतरित करना चाहता हूं। मुझे पता है कि बूस्ट :: इकाइयां लाइब्रेरी पहले से ही एसआई सिस्टम है, लेकिन मैं सभी को स्क्रैच से बनाना चाहता हूं, क्योंकि तब मुझे अपनी परियोजनाओं के लिए अपनी खुद की प्रणाली बनाने की ज़रूरत है (इसलिए मैं इसे सीखने के लिए कर रहा हूं)। मेरे उद्देश्य एक "लंबाई" चर कि इकाइयों का उपयोग कर संशोधित किया जा सकता घोषित करने के लिए है: उदाहरण के लिए मैंउपयोगकर्ता द्वारा परिभाषित रूपांतरण बनाना

Length xLength1 = 5350 * Meters + 2 Kilometers; 

इस प्रयोजन के लिए लिखना चाहते हैं, मैं length.h बना लिया, की परिभाषा युक्त मीटर और किलोमीटर है, और अंत में मैं इन दो इकाइयों के बीच रूपांतरण की घोषणा:

#ifndef LENGTH_H_ 
#define LENGTH_H_ 

#include <boost/units/base_dimension.hpp> 
#include <boost/units/base_unit.hpp> 
#include <boost/units/scaled_base_unit.hpp> 
#include <boost/units/quantity.hpp> 
#include <boost/units/conversion.hpp> 

struct LengthBaseDimension : boost::units::base_dimension<LengthBaseDimension,1>{}; 

typedef LengthBaseDimension::dimension_type LengthDimension; 

struct MeterBaseUnit : boost::units::base_unit<MeterBaseUnit, LengthDimension, 1>{}; 
template <> struct boost::units::base_unit_info<MeterBaseUnit> 
{ 
    static std::string name() { return "meter"; } 
    static std::string symbol() { return "m";  } 
}; 

struct KilometerBaseUnit : boost::units::base_unit<KilometerBaseUnit, LengthDimension, 2>{}; 
template <> struct boost::units::base_unit_info<KilometerBaseUnit> 
{ 
    static std::string name() { return "kilometer"; } 
    static std::string symbol() { return "km";  } 
}; 

// I don't want to use scaled_unit because I need this for my real purpose 
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(KilometerBaseUnit, MeterBaseUnit, double, 1000.0); 

#endif 

तब मैं फ़ाइल units.h जिसमें मैं अपने ही इकाई प्रणाली को परिभाषित बनाने

#ifndef LIB_UNITS_H_ 
#define LIB_UNITS_H_ 

#include "length.h" 
#include <boost/units/unit.hpp> 
#include <boost/units/static_constant.hpp> 
#include <boost/units/make_system.hpp> 
#include <boost/units/io.hpp> 

typedef boost::units::make_system<MeterBaseUnit>::type UnitsSystem; 

typedef boost::units::unit<boost::units::dimensionless_type, UnitsSystem> Dimensionless; 
typedef boost::units::unit<LengthDimension     , UnitsSystem> SystemLength; 


BOOST_UNITS_STATIC_CONSTANT(Kilometer , SystemLength); 
BOOST_UNITS_STATIC_CONSTANT(Kilometers , SystemLength); 
BOOST_UNITS_STATIC_CONSTANT(Meter  , SystemLength); 
BOOST_UNITS_STATIC_CONSTANT(Meters  , SystemLength); 

// Typedefs of dimensions 
typedef boost::units::quantity<SystemLength> Length; 

#endif 

कम से कम, मैं अपने मुख्य कार्य

#include "units.h" 
#include <iostream> 

int main(void) 
{ 
    Length xLength1 (300.0 * Meters); 
    Length xLength2 (1500.0 * Kilometer); 
    Length xLength3; 
    std::cout << xLength2 << std::endl; 
    xLength3 = xLength1 + xLength2; 

    return 0; 
} 

इस परियोजनाओं संकलित में इस शीर्षक का प्रयोग है, लेकिन यह मैं क्या चाहते हैं नहीं करता है। जब मैं परिवर्तनीय xLength2 मुद्रित करता हूं, तो मुझे 1500 मीटर1500 किमी या 1500000 मीटर के बजाय प्राप्त होता है। योग भी गलत है, क्योंकि मैं 1800 मीटर पर रोक लगाता हूं। ऐसा लगता है कि मैं किलोमीटर के रूप में किलोमीटर मानता हूं और रूपांतरण काम नहीं करता है।

मैं क्या गलत कर रहा हूं?

+0

आप 'किलोमीटर' के रूप में 'किलोमीटर' को परिभाषित करते हैं। मुझे याद नहीं है कि 'किलोमीटर' (शायद एक अलग मैक्रो है) को परिभाषित करने का पसंदीदा तरीका क्या है, लेकिन आप 'कॉन्स लम्बाई किलोमीटर = 1000 * मीटर;' (परिभाषाओं के क्रम को शफ़ल करते हुए) जैसे कुछ कोशिश कर सकते हैं। –

+1

लेकिन इस मामले में मैं लिख नहीं सकता और किलोमीटर में मूल्य ले सकता हूं, लेकिन केवल मीटर में। मैं दोनों इकाइयों के साथ काम करने की संभावना चाहता हूं, और जहां आवश्यक हो वहां दोनों मूल्यों का उपयोग करना चाहता हूं। – Jepessen

+0

यदि आप एमएसवीसी ++ या जीसीसी का उपयोग कर रहे हैं, तो बस एक सिर ऊपर, आप प्रत्येक हेडर के शीर्ष पर '#pragma एक बार' के साथ अपने '#IFDEF LENGTH_H_' आदि गार्ड को प्रतिस्थापित कर सकते हैं। –

उत्तर

0

जब तक आप बूस्ट लाइब्रेरी को दोहराना नहीं चाहते हैं, यह यूनिट सिस्टम को कोड करने के लिए एक पागल तरीका जैसा लगता है। टेम्पलेट हैकरी शायद ही कभी सबसे अच्छा विकल्प है।

इसके बजाय, कक्षा का उपयोग करें! नीचे वास्तविक कोड नहीं:

class temperature{ 
    double temp; //always in kelvin 
    temperature(double temperature, char unit){ 
     if(unit=='k') 
       temp=temperature 
     if(unit=='c') 
       temp=temperature+273 
    } 
}; 

और इसलिए आप जो भी इकाई चाहते हैं उसे रूपांतरण लागू करने के लिए। असल में आप एक आधार इकाई चुनते हैं कि सबकुछ के रूप में संग्रहीत किया जाता है, और उसमें से और उसमें कनवर्ट किया जाता है। यदि आप एसआई कर रहे हैं, शायद ग्राम, मीटर, सेकेंड, केल्विन, आदि

+0

यह बूस्ट नहीं है। रास्ते में आता है, इस प्रकार सवाल का जवाब नहीं देता है। – Ruslan

संबंधित मुद्दे