我正在尝试在学习C ++时从Dev C ++迁移到Visual Studio(因为我将不得不使用后者)但是出于某种原因,在Dev C ++中完美运行的相当简单的类实现会创建一个长列表Visual Studio中的错误。
文件很简单:
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文件本身之间的链接,但如果我决定在consoleapplication中使用#include stock2.H而不是.CPP,然后编译器再也找不到方法实现了。
编辑:在匆忙中我忘了发布错误! 他们都是这种形式:错误LNK2005 “public:void __thiscall Stock :: update(double)”(?update @ Stock @@ QAEXN @ Z)已定义于 ConsoleApplication1.obj ConsoleApplication1 //path\ConsoleApplication1\ConsoleApplication1\stock2.obj
答案 0 :(得分:1)
您在stock2.cpp
中添加了ConsoleApplication.cpp
。这意味着stock2.cpp
中的所有代码现在都被编译两次,链接器显示错误消息
Error LNK2005 "public: void __thiscall Stock::<...> already defined
用于现在重复的功能。只需更换
#include "stock2.cpp"
带
#include "stock2.h"
如果您在执行此操作时出现其他错误,请为此发布错误消息。