2017-02-09 97 views
-1

我試圖在學習C++的時候從Dev C++轉移到Visual Studio(因爲我將不得不使用後者),但由於某種原因,一個相當簡單的類在Dev C++中完美工作的實現會在Visual Studio中創建一長串錯誤。Visual Studio不接受類實現[C++]

的文件是簡單的:

  • 頭文件,對構造的聲明,變量等
  • CPP文件,以實現所述的構造,功能等
  • consoleapplication文件(視覺工作室)生成「main()」函數。

stock2.h

#ifndef STOCK2_H_ 
#define STOCK2_H_ 
class Stock 
{ 
public: 
    Stock(); 
    Stock(const char* co, int n = 0, double pr = 0.0); 
    ~Stock(); 
    void show()const; 
private: 
    std::string company; 
    int shares; 
    double share_val; 
    double total_val; 
}; 
#endif 

stock2.cpp

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include "stock2.h" 

Stock::Stock() //default constructor 
{ 
    //code 
} 

Stock::Stock(const char* co, int n, double pr) 
{ 
    //code 
} 

Stock::~Stock() 
{ 
    std::cout << "Stock object has been destroyed" << std::endl; 
} 

//Methods 

void Stock::show() const 
{ 
    //code 
} 

ConsoleApplication.cpp

#include "stdafx.h" 
#include "stock2.cpp" 
int main() 
{ 
    using std::cout; 
    const int STKS = 4; 
    Stock stocks[STKS] = { 
     Stock("NanoSmart", 12, 20.1), 
     Stock("Boffo Objects", 200, 2.0), 
     Stock(), 
     Stock("Monolithic Obelisks", 130, 3.25) 
    }; 
    cout << "Stock Holdings: \n"; 
    for (int st = 0; st<STKS; st++) 
     stocks[st].show(); 
    return 0; 
} 

我試圖發現這裏張貼在其他問題的解決方案,但我真的無法弄清楚這裏有什麼問題。 我也讀過,不應該#include一個cpp文件,因爲頭應該是main()和cpp文件本身之間的鏈接,但是如果我決定在控制檯應用程序中使用#include stock2.H而不是.CPP ,那麼編譯器不能再找到方法實現。

編輯:在趕時間我忘了發佈錯誤! 他們都以這種形式:

錯誤LNK2005 「市民:無效__thiscall股票::更新(雙)」(?更新@股票@@ QAEXN @ Z)在 ConsoleApplication1.obj ConsoleApplication1已經定義//路徑\ ConsoleApplication1 \ ConsoleApplication1 \ stock2.obj

EDIT2:既然很多人都問我關於「解決方案資源管理器」,我最好只需添加一個屏幕截圖向你展示它是如何取得現在 enter image description here

+0

你會得到什麼錯誤?如果編譯器(實際上是鏈接器)在包含頭文件(這是正確的方法)時找不到方法實現,那麼您已經錯誤地設置了項目 – UnholySheep

+3

正如您所知,只包含頭文件。如果您的實施文件包含在您的項目文件中,則應自動編譯和鏈接。在Visual Studio中,確保所有源文件都列在解決方案資源管理器視圖中。如果文件丟失,您可以將文件拖放到此視圖中以將其添加到項目中。 –

+0

我剛剛添加了我得到的錯誤(我完全忘了添加這些!)。無論如何,我使用Visual Studio項目的標準設置,所以我有兩個主文件夾下的項目文件夾:源文件(所有的.cpp文件)和頭文件(我存儲stock2.h) – kn0bbulo

回答

1

你在您的ConsoleApplication.cpp中包含stock2.cpp。這意味着內部stock2.cpp所有的代碼現在被編譯兩次,並且所述接頭示出了錯誤消息

Error LNK2005 "public: void __thiscall Stock::<...> already defined 

爲現在複製功能。只需使用

#include "stock2.h" 

如果你這樣做時,你得到另一個錯誤,請張貼錯誤消息:在此替換

#include "stock2.cpp"