将代码拆分为头文件和主代码

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 &amp;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

以上是关于将代码拆分为头文件和主代码的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义的属性 '$options' 为头选项制作外部 js 文件

如何将 .tlb 文件转换为头文件和实现文件?

如何将值设置为头文件中声明的指针

Cuda不能将类拆分为头和实现

思考题回答

根据父文件头的大小将大型 CSV 文件拆分为多个文件