मैं मीटर और किलोमीटर के लिए इकाइयों को बनाने की कोशिश कर रहा हूं। मैं फिर तदनुसार उन्हें योग और रूपांतरित करना चाहता हूं। मुझे पता है कि बूस्ट :: इकाइयां लाइब्रेरी पहले से ही एसआई सिस्टम है, लेकिन मैं सभी को स्क्रैच से बनाना चाहता हूं, क्योंकि तब मुझे अपनी परियोजनाओं के लिए अपनी खुद की प्रणाली बनाने की ज़रूरत है (इसलिए मैं इसे सीखने के लिए कर रहा हूं)। मेरे उद्देश्य एक "लंबाई" चर कि इकाइयों का उपयोग कर संशोधित किया जा सकता घोषित करने के लिए है: उदाहरण के लिए मैंउपयोगकर्ता द्वारा परिभाषित रूपांतरण बनाना
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 मीटर पर रोक लगाता हूं। ऐसा लगता है कि मैं किलोमीटर के रूप में किलोमीटर मानता हूं और रूपांतरण काम नहीं करता है।
मैं क्या गलत कर रहा हूं?
आप 'किलोमीटर' के रूप में 'किलोमीटर' को परिभाषित करते हैं। मुझे याद नहीं है कि 'किलोमीटर' (शायद एक अलग मैक्रो है) को परिभाषित करने का पसंदीदा तरीका क्या है, लेकिन आप 'कॉन्स लम्बाई किलोमीटर = 1000 * मीटर;' (परिभाषाओं के क्रम को शफ़ल करते हुए) जैसे कुछ कोशिश कर सकते हैं। –
लेकिन इस मामले में मैं लिख नहीं सकता और किलोमीटर में मूल्य ले सकता हूं, लेकिन केवल मीटर में। मैं दोनों इकाइयों के साथ काम करने की संभावना चाहता हूं, और जहां आवश्यक हो वहां दोनों मूल्यों का उपयोग करना चाहता हूं। – Jepessen
यदि आप एमएसवीसी ++ या जीसीसी का उपयोग कर रहे हैं, तो बस एक सिर ऊपर, आप प्रत्येक हेडर के शीर्ष पर '#pragma एक बार' के साथ अपने '#IFDEF LENGTH_H_' आदि गार्ड को प्रतिस्थापित कर सकते हैं। –