【问题标题】:Converting Dollars to Cents and Cents to Dollars将美元转换为美分和美分转换为美元
【发布时间】:2021-03-31 06:19:09
【问题描述】:

目标:

此代码的目标是将美元转换为美分,将美分转换为美元(反之亦然)。

问题:

此代码的问题在于从美元到美分的转换,反之亦然,只能单向进行。如果您删除 operator Dollars() const {return Dollars(m_cents / 100);} 这一行,代码可以正常工作,但单向运行。

Class 的前向声明不起作用并返回 C2027“使用未定义类型'美元'”。 在这种情况下,为什么不转发类的声明?这似乎是一个循环依赖问题。

解决方案:

应该怎么做才能解决这个问题?

#include <iostream>

class Cents;//forward declare Cents for Dollar conversion
class Dollars;

class Cents
{
private:
    int m_cents;
public:
    Cents(int cents = 0)
        : m_cents{ cents }
    {
    }

    // Overloaded int cast
    operator int() const { return m_cents; }

    //int getCents() const { return m_cents; }
    //void setCents(int cents) { m_cents = cents; }

    //Convert Cents into Dollars. C2027 error.
    operator Dollars() const 
    { 
        return Dollars(m_cents / 100); 
    }//myown
};

class Dollars
{
private:
    int m_dollars;
public:
    Dollars(int dollars = 0)
        : m_dollars{ dollars }
    {
    }

    // Overloaded int cast
    operator int() const
    {
        return m_dollars;
    }//myown

    //int getDollars() const { return m_dollars; }//myown
    //void setDollars(int dollars) { m_dollars = dollars; }//myown

    // Allow us to convert Dollars into Cents
    operator Cents() const
    {
        return Cents(m_dollars / 100);
    } //This won't work because it hasn't seen class Cents

};

void printCents(Cents cents)
{
    std::cout << cents << " cents"; // cents will be implicitly cast to an int here
}

void printDollars(Dollars dollars)
{
    std::cout << dollars << " dollars";//myown
}


int main()
{
    //Dollars dollars{ 9 };
    //printCents(dollars); // dollars will be implicitly cast to a Cents here. You get 900 cents
    
    Cents cents{ 2000 };//myown
    printDollars(cents);//myown

    std::cout << '\n';

    return 0;
}

【问题讨论】:

  • 除非您拥有完整的类定义,否则您无法创建Dollar 对象。分解函数并在类定义之外实现它们。

标签: c++ class operator-overloading overloading forward-declaration


【解决方案1】:

可以通过将实现移至 cpp 文件来解决此类问题。这样您就可以在没有循环依赖的情况下包含所需的标头:

美元.hpp

operator Cents() const;

在 Cents.hpp 中

operator Dollars() const;

美元.cpp

#include Cents.hpp
Dollars::operator Cents() const
    {
        return Cents(m_dollars / 100);
    }

在 Cents.cpp 中

#include Dollars.hpp
Cents::operator Dollars() const 
    { 
        return Dollars(m_cents / 100); 
    }

编辑:

如果您想像示例一样将所有内容保存在一个文件中,只需将当前定义替换为声明:

operator Cents() const;
operator Dollars() const;

并将实现移到类之外,例如在 main() 函数上方:

Dollars::operator Cents() const
{
    return Cents(m_dollars / 100);
}

Cents::operator Dollars() const 
{ 
    return Dollars(m_cents / 100); 
}

int main() { /* ... */ }

【讨论】:

  • 嗨,dspr,它似乎不起作用。我已经附上了我在主线程中所做的事情。
  • 我看不出你有什么改变,抱歉。但是看看我的编辑,如果像你的例子一样使用单个文件,我会展示如何修复它:我测试了它并且它有效。
  • 运算符 Cents() const;运算符 Dollars() 常量;以上会导致“Error C2059 syntax error: 'newline'.”
  • 我无法重现该结果,执行(在单个文件中)打印“20 美元”并终止而没有任何错误。另请注意,这两行在实际代码中并没有相互跟随:第一行在 Cents 类中(它替换了您的初始定义),第二行在 Dollars 类中(同上)。是你做的吗?
  • 我试过用你的方法解决,但就是解决不了。感谢您的帮助。
猜你喜欢
  • 2014-02-08
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2013-09-14
  • 2022-06-28
相关资源
最近更新 更多