Не удается решить нерешенную внешнюю ошибку Ошибка LNK2019 - PullRequest
2 голосов
/ 09 марта 2012

Я пытаюсь создать объект класса A. Компиляция работает нормально, но компоновщик жалуется на неразрешенный внешний символ LNK2019 D :: D, на который ссылается функция A :: A.

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

Теперь он даетошибка в том, что он не может найти D :: D, на который есть ссылка в функции A :: A, и некоторые ошибки в том, что он не может найти B :: B в A :: A и D :: D.Я уже пытался добавить основную функцию, исключив определение базового класса, дважды проверил включение файла заголовка ... При выборе «перейти к объявлению» или «перейти к определению» в Visual Studio 10 он может найти точный D:: D функция.Я открыл файлы заголовков, чтобы проверить, правильно ли они направляют файл.

У вас, ребята, есть предложения, где искать следующую ошибку?Вы где-нибудь заметили ошибку?Я искал слишком долго, чтобы понять это самостоятельно.Помощь очень ценится!Кстати, мне пришлось изменить фактическое наименование классов, но я проверил, правильно ли были назначены псевдонимы.Если для выяснения ошибки требуются другие файлы, пожалуйста, дайте мне знать, и я с радостью выложу их здесь.

1 Ответ

0 голосов
/ 10 марта 2012

D.cpp определенно включен в вашу сборку? Если бы D.cpp отсутствовало, вы бы получили эту ошибку.

Чтобы проверить это, попробуйте добавить определения для D в 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 в свою сборку.

...