【发布时间】: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