将代码拆分为头文件和主代码
Posted
技术标签:
【中文标题】将代码拆分为头文件和主代码【英文标题】:split the code into header file and main code 【发布时间】:2021-06-02 16:23:54 【问题描述】:我尝试,但我不知道该怎么做。 具体来说,当我在头文件中编写运算符时遇到问题。我总是得到“重载运算符必须是二元运算符”。我尝试对重载运算符使用友元函数,但它不起作用(我在上面遇到了同样的错误) 这是我的代码
#include <iostream>
#include<vector>
#include<cmath>
using namespace std;
class Cash
private:
int dollars; //private members of the class
int cents;
double cash;
string amt="$";
public:
Cash(int dollars, int cents ) // parameterised constructor accepting two int inputs
this->dollars=dollars;
this->cents=cents;
setcash(); //Calling setcash method to set the cash value
Cash(int dollars) //parameterised constructor accepting one int input
this->dollars=dollars;
cents=0;
setcash(); //Calling setcash method to set the cash value
Cash() //default constructor
dollars=0;
cents=0;
setcash(); //Calling setcash method to set the cash value
int getdollar() //method to return dollar value
return dollars;
int getcents() //method to return cents value
return cents;
void setcash() //setcash method definition
if (cents==0)
cash=(double)dollars;
return;
/* converting cent value into dollar to get total cash amount */
double centindouble=(double)cents;
double centsindollar=centindouble/pow(10,floor(log10(abs(cents)) + 1));
cash=(double)dollars + centsindollar;
double getcash() //method to return net cash
return cash;
string toString() //converting cash into string as per question
amt=amt+to_string(cash);
return amt;
bool operator ==(Cash &c) //overloading == operator to compare two cash obj
if(getcash()==c.getcash())
return true;
else
return false;
bool operator >(Cash &c)//overloading > operator to compare two cash obj
if(getcash()>c.getcash())
return true;
else
return false;
bool operator <(Cash &c)//overloading < operator to compare two cash obj
if(getcash()<c.getcash())
return true;
else
return false;
Cash operator+(Cash c) //overloading + operator to add values of two cash obj
int dlr=dollars+c.getdollar();
int cts=cents+c.getcents();
Cash c1(dlr,cts);
return c1;
Cash operator-(Cash &c) //overloading - operator to subtract values of two cash obj
int dlr=dollars-c.getdollar();
int cts=cents-c.getcents();
Cash c1(dlr,cts);
return c1;
void operator *(int n)//overloading * operator to multiply values of cash obj
dollars=dollars*n;
cents=cents*n;
setcash();
;
/* Driver Method to Test our Program */
int main()
Cash c(100,5);
Cash a(100,5);
if(c==a)
cout<<"Equal "<<endl;
Cash d=c+a;
Cash f=c-a;
cout<<c.getcash()<<endl;
cout<<d.getcash()<<endl;
cout<<f.getcash()<<endl;
cout<<d.toString();
【问题讨论】:
请将您的代码缩减为重现错误所需的代码。专注于重载的运算符,并摆脱与该运算符无关的内容(c.f. minimal reproducible example)。此外,指出错误在程序中的哪个位置被触发会很有帮助。 难道你不需要从主函数中也返回一些东西,比如 return 0 吗? @The_Redhawk main function 的特殊之处在于它不需要明确的return
语句(链接页面中的第4 点)。
我从来不知道。谢谢你的链接。每天学习一些东西。
【参考方案1】:
在您提供的代码中,您的所有方法都已声明和定义。
要在 .h/.cpp 中拆分,您需要 .h 中的声明和 .cpp 中的定义
.h
#include <iostream>
#include<vector>
#include<cmath>
using namespace std;
class Cash
private:
int dollars; //private members of the class
int cents;
double cash;
string amt="$";
public:
Cash(int dollars, int cents );
Cash(int dollars);
Cash();
int getdollar();
int getcents();
void setcash();
double getcash();
string toString();
bool operator ==(Cash &c);
bool operator >(Cash &c);
bool operator <(Cash &c);
Cash operator+(Cash c);
Cash operator-(Cash &c);
void operator *(int n);
;
.cpp(示例中仅给出一种方法)
#include "whateveryourname.h"
Cash::Cash() //default constructor
dollars=0;
cents=0;
setcash(); //Calling setcash method to set the cash value
另外,我会在构造函数中初始化字符串amt
。
【讨论】:
在头文件中声明和定义inline
函数是合法的,有时也是可取的。将值清零的默认构造函数是此操作的主要候选者。
@JaMiT,我的理解是这正是“如何拆分 .h 和 .cpp”的问题。
我按照你说的写了,但我仍然收到错误bool operator Cash::==(Cash &c) //overloading == operator to compare two cash obj if (getCash() == c.getCash()) return true; else return false;
“Cash:: 和 getCash() 出现错误。我想我把 Cash:: 放在了错误的地方.
如果您按照我的建议将定义放入 cpp 文件中:bool Cash::operator==(Cash &c)code in here以上是关于将代码拆分为头文件和主代码的主要内容,如果未能解决你的问题,请参考以下文章