我的班级创建的LNK 2019错误

时间:2013-08-13 17:13:05

标签: c++ visual-studio-2010 class header lnk2019

我已经使用这个模板来创建我的类来存储程序各个部分的数据。

//Classs that DOES NOT work
//"MiningPars.h"
#pragma once
#ifndef MININGPAR_H
#define MININGPAR_H
#include <iostream>
#include <fstream>
using namespace std;
class MiningPars
{
public:
    int NumYears;
    double iRate;
    int MaxMineCap;
    int MaxMillCap;
    int SinkRate;
    double ReclaimCost;
    double PitSlope;

public:
    MiningPars();

    MiningPars(int numYears,double irate,int maxMineCap,int maxMillCap,
        int sinkRate, double reclaimCost, double pitSlope): NumYears(numYears),
        iRate(irate),MaxMineCap(maxMineCap),MaxMillCap(maxMillCap),SinkRate(sinkRate),
        ReclaimCost(reclaimCost),PitSlope(pitSlope) {}
            };
            #endif

当我刚宣布一个新的挖掘标准时,它给了我错误

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall MiningPars::MiningPars(void)" (??0MiningPars@@QAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'par''(void)" (??__Epar@@YAXXZ) 

即。我的代码看起来像这样:

    #include "MiningPars.h"

    MiningPars par;//Error
    vector <PredecessorBlock> PREDS;//is okay
    void main()
    {
        par.iRate = .015;
        //... etc.  
    }

大多数MSDN和其他谷歌搜索都说我没有正确宣布或者我没有添加适当的依赖,但它与我创建另一个类的格式相同。我可以在这里看到我的其他工作的一个例子:

//Classs that works
#pragma once

#ifndef PREDECESSOR_H
#define PREDECESSOR_H
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;


class PredecessorBlock
{
public:
    int BLOCKID;
    vector <int> PREDS_IDS;
    int PredCount;

public:
    PredecessorBlock();

    PredecessorBlock(int blockID,vector<int>predsids,
        int predcount) : BLOCKID(blockID), 
        PREDS_IDS(predsids), PredCount(predcount)
    {}


};

#endif

所以这对我来说很困惑。我感谢您提供的任何建议

3 个答案:

答案 0 :(得分:1)

  

main.obj:错误LNK2019:未解析的外部符号“public:__thiscall MiningPars :: MiningPars(void)”

Linker抱怨没有为MiningPars提供默认构造函数定义。

class MiningPars
{
    ...
     MiningPars(); // This is declaration.
                   // Have you forgotten to provide the definition of it
                   // in the source file ?

并且

MiningPars par;

上面的语句调用默认构造函数。如果定义为空,则执行 -

MiningPars() {}
在类定义中的

就像你为参数化构造函数所做的那样。

答案 1 :(得分:0)

写作时

MiningPars par;

在堆栈上创建类型为MiningPars的par对象。要创建一个对象,将调用构造函数(在本例中为默认值,即没有参数的构造函数),但不要在MiningPars类中定义构造函数。

要解决此问题,请在类cpp文件中定义构造函数,或者如果构造函数不需要执行任何操作,则可以在头文件中编写空内联定义:

class MiningPars
{
public:
    MiningPars() {}
...
};

或者只是不声明默认构造函数,编译器会为你生成一个空构造函数。

答案 2 :(得分:0)

我同意马赫什 在你的班级里面          MiningPars()的 {}