背景說明
在面向對象編程的過程中,為了結構清晰,通常將不同的類定義在不同的文件里
使用時通過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