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 やその他の Google 検索では、正しく宣言していないか、適切な依存関係を追加していないと言われていますが、別のクラスを作成したのと同じ形式です。私の他の作品の例はここで見ることができます:

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

タイプの par オブジェクトがMiningParsスタック上に作成されます。MiningParsオブジェクトを作成するには、コンストラクター (この場合は引数のないデフォルトのコンストラクター) が呼び出されますが、クラスでコンストラクターを定義しません。

これを解決するには、クラスの cpp ファイルでコンストラクターを定義するか、コンストラクターが何もする必要がない場合は、ヘッダー ファイルに空のインライン定義を記述します。

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

または、デフォルトのコンストラクターを宣言しないと、コンパイラーが空のコンストラクターを生成します。

于 2013-08-13T17:24:07.693 に答える
0

あなたのクラス MiningPars() {}内のマヘシュに同意します

于 2013-08-13T17:24:19.273 に答える