显示两个类之间转换的输出数据

Display Output Data for conversion between 2 Classes

本文关键字:转换 之间 输出 数据 两个 显示      更新时间:2024-05-09

我实现了从英尺到米的转换,如下所述,但我无法在main中打印出结果。以下是中产生错误的代码

Ftr cnum1(2);
Mtr cnum2 = cnum1.toMtr();
std::cout << cnum1.getNum() <<" feet = " << cnum2.getMtrNum() << " meters nn";

我无法将getNum方法与cnum2一起使用,因为getNum不是Mtr中的方法。但是,结果可以准确地显示在Ftr.cpp文件中

#include "Ftr.h"
#include <iostream>
#include <string>
namespace fun::calc 
{
Ftr::~Ftr() { }
Ftr::Ftr(double Ftr) noexcept { }
double Ftr::getNum() const noexcept { return m_Num;}
Mtr Ftr::toMtr() const noexcept { return Mtr(m_Num * fInMtr); } 

Ftr头文件包含以下内容:

#ifndef __FTR_H
#define __FTR_H
#include <cstdint>
#include “Mtr.h”
namespace fun::calc 
{

class Mtr;  
class Ftr
{  
double m_Num;
static constexpr double fInMtr = 0.3048;
public:
Ftr() = delete;
explicit Ftr(double Ftr) noexcept;
~Ftr() noexcept;
Ftr(const Ftr &other) = default;
Ftr(Ftr &&other) = default;
double getNum() const noexcept;
Ftr operator+(const Ftr &rhs) const;
Mtr toMtr() const noexcept;       
};
}
#endif;

我尝试在Mtr.cpp中创建一个getMtrNum函数,如下所示:

double Meters:: getMtrNum () const noexcept { return m_mtr;}

我修改了main((以使用getMtrNum,如下所示

Ftr cnum1(2);
Mtr cnum2 = cnum1.toMtr();
std::cout << cnum1.getNum() <<" feet = " << cnum2.getMtrNum() << " meters nn";

结果现在显示0.0,因为在mtr.h文件中n_mtr已初始化为0.0产生的输出为:2英尺=0米关于如何实现这一点以在函数定义之外显示正确的结果,有什么建议吗?理想情况下,我希望在不必创建getMtrNum的情况下生成正确的结果。请提供一些关于如何正确获取两个不同类别之间的数据流并正确显示结果的指导。

如果我理解正确,你想做两点:

  1. 修复代码,使其显示转换值
  2. 在不创建getMtrNum((的情况下进行打印

第二点是,如果您想让您的成员保持私有,那么在任何情况下都需要创建一个getter/printer函数。如果你创造了一个"ostream",可能会更优雅一点<lt"操作员过载。这样,您就不需要在打印Meters时使用getter函数。

编辑:更准确地说,仍然使用getter。一旦操作员过载

std::ostream& operator<<(std::ostream& out, const Meters& m)
{
out << m.Get();
return out;
}
// in main
// std::cout << cnum1.Get() <<" feet = " << cnum2 << " meters nn";

一个完整的工作示例:

#include <iostream>
class Meters {
public:
Meters(const Meters& m)
:m_Meters(m.m_Meters)
{
}
Meters(double m)
:m_Meters(m)
{
}
double Get() const { return m_Meters; }
private:
double m_Meters{};
};
std::ostream& operator<<(std::ostream& out, const Meters& m)
{
out << m.Get();
return out;
}
class Feet{
public:
Feet(double f)
: m_Feet(f)
{}
static constexpr double fInMtr = 0.3048;
Feet() = default;
Meters ToMeters() const { return Meters(m_Feet * fInMtr); }
double Get() const { return m_Feet; }
private:
double m_Feet{};
};
int main()
{
Feet cnum1(2);
Meters cnum2 = cnum1.ToMeters();
std::cout << cnum1.Get() <<" feet = " << cnum2 << " meters nn";
}

我希望,这就是你想要的。