0

我一直在使用这个模板来制作我的类来存储程序各个部分的数据。

//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

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

4

3 回答 3

1

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

链接器抱怨没有为MiningPars.

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

MiningPars par;

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

MiningPars() {}

在类定义中,就像对参数化构造函数所做的那样。

于 2013-08-13T17:17:28.897 回答
0

当你写

MiningPars par;

MiningPars在堆栈上创建一个 par 类型的对象。为了创建一个对象,构造函数(在这种情况下是默认的,即没有参数的)被调用,但是你没有在你的MiningPars类中定义构造函数。

要解决这个问题,要么在你的类 cpp 文件中定义构造函数,或者如果构造函数不需要做任何事情,你可以在头文件中编写空的内联定义:

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

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

于 2013-08-13T17:24:07.693 回答
0

我同意你课堂上的 Mahesh MiningPars() {}

于 2013-08-13T17:24:19.273 回答