2

クラス A のオブジェクトを作成しようとしています。コンパイルは正常に動作しますが、関数 A::A で参照されている LNK2019 未解決の外部シンボル D::D についてリンカが文句を言います。

A.cpp

#include "../A.hpp"

using namespace <name>;

A::A(D* low, D* mid, D* high, M* m)
{
    std::vector<B*>* lTC = split(low);
    std::vector<B*>* mTC = split(mid);
    std::vector<B*>* hTC = split(high);

    D* lDC = new D(lTC);
    D* mDC = new D(mTC);
    D* hDC = new D(hTC);

    mr = m;

    procRDC = new std::vector<D*>();
    procRDC->push_back(lDC); 
    procRDC->push_back(mDC);
    procRDC->push_back(hDC);
}

std::vector<B*>* A::split(D* d)
{
    std::vector<B*>* tc = new std::vector<B*>();
    std::vector<B*>* ob = d->getB();

    for ( std::vector<B*>::iterator it = ob->begin(); it != ob->end(); ++it )
    {
        B* b= *it;

        int a1 = b->getA;
        int a2 = b->getA;
        int a3 = b->getA;

        B* b1 = new B(a1, a2, a3);
        B* b2 = new B(a3, a2, a1);

        tc ->push_back(b1);
        tc ->push_back(b2);
    }

    return tc;
}

A.hpp

#ifndef A_HPP
#define A_HPP

#include "../dec.hpp"
#include "../D.hpp"
#include "../M.hpp"
#include "../B.hpp" 
#include <vector>

using namespace <name>;

class A: public dec
{
protected:
    M* mr;
    std::vector<D*>* procRDC;

public:
    A(D* low, D* mid, D* high, M* marketRound);

protected:
    std::vector<B*>* split(D* d);

}; // class A

#endif

基本クラス dec.cpp には空のコンストラクターが含まれています。D.cpp も提供します。

#include "../D.hpp"

using namespace <name>;

D::D(std::vector<B*>* b) 
{
    bs = b;
}

std::vector<B*>* D::getB()
{
    return bs;
}

とD.hpp

#ifndef D_HPP
#define D_HPP

#include "../B.hpp"
#include <vector> 

using namespace <name>;

class D: public C
{
protected:
    std::vector<B*>* bs;

public:
    D(std::vector<B*>* b);
    std::vector<B*>* getB();

}; // class D

#endif

クラス C には空のコンストラクタのみが含まれます

B.cpp

#inlcude "../B.hpp"

using namespace <name>

B::B(int a1, int a2, int a3)
{
    a1 = a1;
    a2 = a2;
    a3 = a3;
}

int B::getA() { return a1;  }

B.hpp

#ifndef B_HPP
#define B_HPP

#include "../O"

using namespace <name>

class B : public O
{
protected:
    int a1;
    int a2;
    int a3;

public:
    B(int a1, int a2, int a3);

public:
    int B::getA();

};

#endif

現在、関数 A::A で参照されている D::D が見つからないというエラーと、A::A と D::D の両方で B::B が見つからないといういくつかのエラーが発生します。私はすでにメイン関数を追加しようとしましたが、基本クラスの定義を削除し、ヘッダー ファイルのインクルードを再確認しました... Visual Studio 10 で「宣言にジャンプ」または「定義にジャンプ」を選択すると、正確な D: を見つけることができます。 :D 関数。ヘッダー ファイルを開いて、正しいファイルに向けられているかどうかを確認しました。

エラーを解消するために次にどこを見るべきか提案はありますか? どこか間違いに気づきませんか?私は自分でそれを理解するにはあまりにも長い間検索しました。助けていただければ幸いです。ところで、クラスの実際の名前を変更する必要がありましたが、疑似名が正しく割り当てられているかどうかを確認しました。間違いを明確にするために他のファイルが必要な場合は、お知らせください。喜んでここに掲載します。

4

1 に答える 1

0

D.cppビルドに確実に含まれていますか? 欠落している場合D.cpp、このエラーが発生します。

確実に確認するには、 D in の定義を追加してみてくださいD.hpp

class D: public C
{
protected:
    std::vector<B*>* bs;

public:
    D(std::vector<B*>* b) : bs(b) {}
    std::vector<B*>* getB() { return bs; }

}; // class D

これでリンカー エラーが修正された場合D.cppは、ビルドに含めていません。

于 2012-03-09T20:54:52.000 に答える