當有多個類時,應該將類分別在不同的頭文件中聲明,然後在另外的.cpp文件中寫函數的實現。
而在main.cpp中應該只包含類的頭文件就行,不需要包含類的函數的實現的.cpp文件。
例如我在Class_Book.h 文件中寫了book類的聲明:
#pragma once
class book{
public:
bool same(book &);//判斷是否爲同一本書
void Input(std::string , double);
void Input(double);
void Output_Price();
void Output_Isbn();
book(std::string isbn,double price);
book(double price);
book(std::string isbn);
private:
std::string isbn;
double price;
};
在文件”Book.cpp“中完成了book類中函數的實現:
#pragma once
#include <iostream>
#include <iomanip>
#include <string>
#include "Class_Book.h"
void book::Input(std::string _isbn,double _price)
{
isbn = _isbn;
price = _price;
}
void book:: Input(double _price)
{
price = _price;
}
book::book(std::string _isbn,double _price)
{
isbn = _isbn;
price = _price;
}
book::book(double _price)
{
price = _price;
}
book::book(std::string _isbn)
{
isbn = _isbn;
}
bool book:: same(book &a)
{
return (isbn == a.isbn);
}
void book:: Output_Price()
{
std::cout << price << std::endl;
return ;
}
void book::Output_Isbn()
{
std::cout << isbn <<std::endl;
}
那麼在main函數中應該如下:
#include <iostream>
#include "Class_Book.h"
using namespace std;
int main()
{
...
}
這樣才能保證正常的完成編譯,運行。
另外要注意的時,不要在”Book.cpp“中使用 using namespace 語句,以防止與main函數中用的命名空間衝突,故在"Book.cpp"中均用的是 std:string, std::cout等。
錯誤的"main.cpp"中寫法如下:
#include ”iostream“
#include "Book.cpp"
int main()
{
...
}
這樣雖然編譯的時候沒錯,但是會在運行是報LNK2005錯誤,也就是出現了多重定義。
這是因爲在編譯時,工程內所有的.cpp文件都會被編譯生成.obj文件(也就是在此例中main,cpp和book.cpp都被編譯,分別生成了main.obj和book.obj文件),如果在main.cpp中用include 包含了”Book.cpp“的話,由於宏的實現,導致在main.obj文件中有book類的函數實現,book.obj文件中也有book類的函數實現,從而導致了多重定義的錯誤。