c++ include .h .cpp 的區別


背景說明

在面向對象編程的過程中,為了結構清晰,通常將不同的類定義在不同的文件里
使用時通過include .h文件即可,不用include .cpp
正常情況下,定義一個類,將聲明寫在.h文件中,將實現寫在.cpp文件中,.cpp文件中include .h文件即可
但是,我這個類不是通過IDE創建的,而是我自己新建文件,自己寫出來的,其實這里就是問題所在

.h文件
#pragma once

class duoxiangshi
{
private:
    int a[100]={0};
    int maxexponent;
public:
    duoxiangshi(int *p,int maxexponent);
    ~duoxiangshi();
    void printdxs();
    friend duoxiangshi dxs_minus(duoxiangshi dxs1,duoxiangshi dxs2);
};
.cpp文件
#include "duoxiangshi.h"
#include <iostream>
using namespace std;

duoxiangshi::duoxiangshi(int *p=NULL,int maxexponent=0)
{
    this->maxexponent=maxexponent;
    if(p!=NULL)
    {
        for(int i=0;i<=maxexponent;i++)
        {
            a[i]=p[i];
        }
    }
}
void duoxiangshi::printdxs()
{
    if(a[0]!=0)
        cout<<1<<'+';
    for(int i=1;i<maxexponent;i++)
    {
        if(a[i]!=0)
        cout<<"x^"<<i<<'+';
    }
    if(a[maxexponent]!=0)
        cout<<"x^"<<maxexponent<<endl;
}

duoxiangshi::~duoxiangshi(){}

duoxiangshi dxs_minus(duoxiangshi dxs1,duoxiangshi dxs2)
{
    duoxiangshi temp=duoxiangshi();
    int maxexpo=dxs1.maxexponent;
    //dxs1-dxs2
    for(int i=maxexpo;i>=0;i--)
    {
        temp.a[i]=dxs1.a[i]-dxs2.a[i];
        if(temp.a[i]<0)
            temp.a[i]*=-1;
    }
    for(int i=maxexpo;i>=0;i--)
    {
        if(temp.a[i]==0)
        {
            --maxexpo;
        }else
        {
            break;
        }
    }
    temp.maxexponent=maxexpo;
    return temp;
}

但是這次在main函數所在文件開頭include .h 文件卻報錯,未定義之類的錯誤
后來試了一下include .cpp文件,成功運行
不難想到,IDE在創建項目的時候,會有額外的文件記錄項目的組成和依賴關系等信息,以方便編譯運行
比如vs就是利用.sln(solution)解決方案文件做到這點的,當然里面還有其他信息

SLN ( own's the following details):

    * A list of the projects that are to be loaded into Visual Studio 2005
    * A list of project dependencies
    * Microsoft Visual SourceSafe information
    * A list of add-ins that are available 
以下就當作在vs環境下創建項目

該類是我自己創建文件並編寫的,沒有使用IDE創建類的接口,因此.sln的文件沒有記錄我創建的類文件的信息
仔細回想一下,include 對應的.h文件而不用include .cpp文件就可以運行確實需要額外的信息
編譯器可以自動找到對應的.cpp實現文件將其鏈接編譯

分析下解決方案的作用

通過IDE創建類會自動將.h .cpp文件加入解決方案,並且一一對應,鏈接編譯時讀取解決方案
遇到.h文件聲明,將對應的.cpp文件也進行處理
而不在解決方案內的類文件.h .cpp則不會被編譯器識別
所以需要利用#include命令將.cpp文件(定義實現)包含進啦(相當於復制.cpp文件的內容放在這里)
只是#include .h 文件僅僅將聲明加入進來,編譯器找不到.cpp中的定義實現
所以才會出現開頭的錯誤
因此,開頭引入.h文件,在文件的最后#include .cpp文件同樣可以運行,這也證明了#include .cpp就是復制內容加入進來
這個時候應該將
#include .h 文件理解為聲明
#include .cpp 文件理解為實現(代碼復制拷貝)
平時寫代碼時也是這樣,調用某個函數,前面要么把該函數定義了,要么聲明一下,然后在后面定義
在自己創建類文件(沒有加入解決方案)的時候應該在開頭(函數調用前)#include .cpp 把定義加入進來
或者在開頭(函數調用前)加入聲明#include .h,在后面加入定義#include .cpp


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM