2017-02-09 96 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"