LNK2005 的一種情況吧


當有多個類時,應該將類分別在不同的頭文件中聲明,然後在另外的.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類的函數實現,從而導致了多重定義的錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章