错误LNK2019:未解析的外部符号

时间:2013-12-08 12:24:08

标签: c++ stl

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#ifndef ViasLigacaoAuto_
#define ViasLigacaoAuto_

#include <iostream>
#include <string>
using namespace std;
#include "LocInteresse.h"
#include "ViasLigacao.h"

class ViasLigacaoAuto : public ViasLigacao
{
private:
    float precoportagem;

public:
    ViasLigacaoAuto();
    ViasLigacaoAuto(LocInteresse* &locInteresse1,LocInteresse* &locInteresse2,string codigodavia,int totalkms,int tempomedio,float precoportagem);
    ViasLigacaoAuto(string codigodavia,int totalkms,int tempomedio,float precoportagem);
    ViasLigacaoAuto(const ViasLigacaoAuto& va);
    ~ViasLigacaoAuto();

    float getPrecoportagem()const;
    void setPrecoportagem(float precoportagem);



        void listar()const; 
        ViasLigacao* ViasLigacaoAuto :: clone() { return new ViasLigacaoAuto(*this);}           //criar uma copia de um objecto que ja existe

        ViasLigacaoAuto& operator=(const ViasLigacaoAuto &va); 
        virtual void ViasLigacaoAuto:: escrever(ostream &out) const;
};


//constructores

ViasLigacaoAuto :: ViasLigacaoAuto() : ViasLigacao()
{
    this->precoportagem=-1;
}

ViasLigacaoAuto :: ViasLigacaoAuto(LocInteresse* &locInteresse1,LocInteresse* &locInteresse2,string codigodavia,int totalkms,int tempomedio,float precoportagem) :
    ViasLigacao(locInteresse1,locInteresse2,codigodavia,totalkms,tempomedio)
{
    (*this).setPrecoportagem(precoportagem);
}

    ViasLigacaoAuto::ViasLigacaoAuto(const ViasLigacaoAuto& va) : ViasLigacao(va)
{
    this->precoportagem=va.precoportagem;
}

    ViasLigacaoAuto :: ~ViasLigacaoAuto()
{
}


void ViasLigacaoAuto::setPrecoportagem(float precoportagem)
{
    (*this).precoportagem=precoportagem;
}

float ViasLigacaoAuto::getPrecoportagem()const{
    return (*this).precoportagem;
}


void ViasLigacaoAuto :: listar() const
{

}

    ViasLigacaoAuto& ViasLigacaoAuto::operator=(const ViasLigacaoAuto &va)
{

    if(this!=&va)
    {
        precoportagem=va.precoportagem;
        ViasLigacao::operator=(va);
    }

    return (*this);
}


    void ViasLigacaoAuto :: escrever(ostream &out) const
{
    out << "Autoestrada " << endl;
    ViasLigacao::escrever(out);         //atributos herdados da classe viasligacao
    out << "Preco da portagem: " << precoportagem << endl;


}

    ostream& operator<<(ostream &o, const ViasLigacaoAuto &va)      
{
    va.escrever(o);
    return o;
}

#endif

*

#pragma once
#ifndef _ApViasLigacao_
#define _ApViasLigacao_

#include <ostream>

using namespace std;

#include "ViasLigacao.h"
#include "ViasLigacaoAuto.h"
#include "ViasLigacaoNacional.h"
#include "Teste.h"
#include "LocInteresse.h"
#include "LocInteresseCult.h"
#include "LocInteresseNat.h"

//---------Classe apontador para ViasLigacao---------

class ApViasLigacao {
private:
    ViasLigacao *apvl;

    enum TipoComparacao { KMS , CUSTO ,TEMPO}; 
    static TipoComparacao  tipoComparacao;

public:
    static void setComparacaoKMS();
    static void setComparacaoCUSTO();
    static void setComparacaoTEMPO();

    int getTotalkms() const;

    virtual float getPrecoportagem() const;
    int getTempomedio()const;

    LocInteresse* getLocIni();
    void setLocIni(LocInteresse);
    LocInteresse* getLocFim();
    void setLocFim(LocInteresse);


    ApViasLigacao();
    ApViasLigacao(ViasLigacao* &vl);
    ApViasLigacao(string codigodavia,int totalkms,int tempomedio,float precoportagem);
    ApViasLigacao(string codigodavia,int totalkms,int tempomedio,string pavimento);
    ApViasLigacao(const ApViasLigacao &vl);
    ~ApViasLigacao();


    const ApViasLigacao & operator=(const ApViasLigacao &vl);
    bool operator >(const ApViasLigacao &vl) const;
    bool operator <(const ApViasLigacao &vl) const;
    bool operator ==(const ApViasLigacao &vl) const;
    ApViasLigacao operator+(const ApViasLigacao &vl);
    const ApViasLigacao & operator+=(const ApViasLigacao &vl);

    void write(ostream &out) const;
};

ApViasLigacao::TipoComparacao ApViasLigacao::tipoComparacao=ApViasLigacao::TipoComparacao::KMS;

void ApViasLigacao::setComparacaoKMS() {
    tipoComparacao=TipoComparacao::KMS;
}
void ApViasLigacao::setComparacaoCUSTO() {
    tipoComparacao=TipoComparacao::CUSTO;
}
void ApViasLigacao::setComparacaoTEMPO(){
    tipoComparacao=TipoComparacao::TEMPO;
}

int ApViasLigacao::getTotalkms() const {
    return apvl->getTotalkms();
}
float ApViasLigacao::getPrecoportagem() const {
    return apvl->getPrecoportagem();
}
int ApViasLigacao::getTempomedio() const {
    return apvl->getTempomedio();
}

ApViasLigacao::ApViasLigacao() {
    this->apvl = new ViasLigacaoAuto();
}

ApViasLigacao::ApViasLigacao(string codigodavia,int totalkms,int tempomedio,float precoportagem) {
    apvl = new ViasLigacaoAuto(codigodavia, totalkms,tempomedio, precoportagem);
}

ApViasLigacao::ApViasLigacao(string codigodavia,int totalkms,int tempomedio,string pavimento) {
    apvl = new ViasLigacaoNacional(codigodavia,totalkms,tempomedio,pavimento);
}


ApViasLigacao::ApViasLigacao(ViasLigacao* &vl) {
    this->apvl = vl->clone();
}
ApViasLigacao::ApViasLigacao(const ApViasLigacao &vl) {
    this->apvl = vl.apvl->clone();
}
ApViasLigacao::~ApViasLigacao() {
    delete apvl;
}

//bool compara(int km1, int km2, double c1, double c2, std::

bool ApViasLigacao::operator >(const ApViasLigacao &vl) const { 
    if (tipoComparacao==TipoComparacao::KMS) return (*this).getTotalkms() > vl.getTotalkms();
    if (tipoComparacao==TipoComparacao::CUSTO){
        if((*this).getPrecoportagem() == vl.getPrecoportagem()){
            return (*this).getTotalkms() > vl.getTotalkms();
        }
        return (*this).getPrecoportagem() > vl.getPrecoportagem();
    }
    return (*this).getTempomedio() > vl.getTempomedio();

}
bool ApViasLigacao::operator <(const ApViasLigacao &vl) const {
    if (tipoComparacao==TipoComparacao::KMS) return (*this).getTotalkms() < vl.getTotalkms();
    if (tipoComparacao==TipoComparacao::CUSTO){
        if((*this).getPrecoportagem() == vl.getPrecoportagem()){
            return (*this).getTotalkms() < vl.getTotalkms();
        }
        return (*this).getPrecoportagem() < vl.getPrecoportagem();
    }
    return (*this).getTempomedio() < vl.getTempomedio();
}

bool ApViasLigacao::operator ==(const ApViasLigacao &vl) const {
    if (tipoComparacao==TipoComparacao::KMS) return (*this).getTotalkms() == vl.getTotalkms();
    if (tipoComparacao==TipoComparacao::CUSTO) return (*this).getPrecoportagem() == vl.getPrecoportagem();
    return (*this).getTempomedio() == vl.getTempomedio();
}


ApViasLigacao ApViasLigacao::operator+(const ApViasLigacao &vl) {
    return ApViasLigacao("", (*this).getTotalkms()+vl.getTotalkms(), (*this).getTempomedio()+vl.getTempomedio(), (*this).getPrecoportagem()+vl.getPrecoportagem());
}

const ApViasLigacao & ApViasLigacao::operator+=(const ApViasLigacao &vl) {

    this->apvl->setTotalkms(this->apvl->getTotalkms()+vl.apvl->getTotalkms());
        this->apvl->setTempomedio(this->apvl->getTempomedio()+vl.apvl->getTempomedio());
        if (typeid(*apvl)==typeid(ViasLigacaoAuto)) {
            ViasLigacaoAuto *vla = (ViasLigacaoAuto *)this->apvl;
        vla->setPrecoportagem(vla->getPrecoportagem()+vl.apvl->getPrecoportagem());
    }   
    return  *this;
}

const ApViasLigacao & ApViasLigacao::operator=(const ApViasLigacao &vl) {
    this->apvl = vl.apvl->clone();
    return *this;
}
void ApViasLigacao::write(ostream &out) const {
    out << *apvl;
}


ostream &operator <<(ostream &out, const ApViasLigacao &vl)
{
    vl.write(out);
    return out;
}


#endif

*

#define _CRT_SECURE_NO_WARNINGS
#ifndef ViasLigacao_
#define ViasLigacao_
#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

#include "LocInteresse.h"


class ViasLigacao 
{
private:
    LocInteresse locInteresse1, locInteresse2;
    string codigodavia;
    int totalkms;
    int tempomedio;

public:
    ViasLigacao();
    ViasLigacao(LocInteresse* locInteresse1,LocInteresse* locInteresse2,string codigodavia,int kms,int tempo);
    ViasLigacao(const ViasLigacao &v);
    virtual ~ViasLigacao();   //destructor

    void listar()const;
    virtual ViasLigacao* clone()const;

    LocInteresse* getLocInteresse1();
    void setLocInteresse1(LocInteresse);
    LocInteresse* getLocInteresse2();
    void setLocInteresse2(LocInteresse);


    string getCodigodavia()const;
    void setCodigodavia(string codigodavia);

    int getTotalkms()const;
    void setTotalkms(int kms);

    int getTempomedio()const;
    void setTempomedio(int tempo);

    virtual float getPrecoportagem() const;

    const ViasLigacao & operator=(const ViasLigacao &v);
    bool operator>(const ViasLigacao &v) const; 
    bool operator==(const ViasLigacao &v) const;
    bool operator <(const ViasLigacao &v) const;
    bool operator<=(const ViasLigacao &v)const;
    ViasLigacao operator+(const ViasLigacao &v);
    const ViasLigacao & operator+=(const ViasLigacao &v);

    void escrever(ostream &out) const;                 // só se mete VIRTUAL quando sao subclasses

};

ViasLigacao::ViasLigacao()
{
    codigodavia = " ";
    totalkms= -1;
    tempomedio=-1;
}

ViasLigacao::ViasLigacao(LocInteresse* LocInteresse1, LocInteresse* LocInteresse2,string codigodavia, int totalkms,int tempomedio)
{
    //this->locInteresse1=LocInteresse1;
//  this->locInteresse2=LocInteresse2;
    this->codigodavia = codigodavia;
    this->totalkms = totalkms;
    this->tempomedio=tempomedio;
}

ViasLigacao::ViasLigacao(const ViasLigacao & v)
{
    this->locInteresse1=v.locInteresse1;
    this->locInteresse2=v.locInteresse2;
    this->codigodavia = v.codigodavia;
    this->totalkms = v.totalkms;
    this->tempomedio= v.tempomedio;
}

ViasLigacao::~ViasLigacao()
{
}

//set's e get's

void ViasLigacao::setLocInteresse1(LocInteresse locInteresse1)
{
    locInteresse1 = locInteresse1;
}

LocInteresse* ViasLigacao::getLocInteresse1(){
    return &locInteresse1;
}


void ViasLigacao::setLocInteresse2(LocInteresse locInteresse2)
{
    locInteresse2 = locInteresse2;
}

LocInteresse* ViasLigacao::getLocInteresse2(){
    return &locInteresse2;
}


void ViasLigacao::setCodigodavia(string codigodavia)
{
    this->codigodavia = codigodavia;
}

string ViasLigacao::getCodigodavia()const{
    return this->codigodavia;
}

void ViasLigacao::setTotalkms(int totalkms)
{
    this->totalkms = totalkms;
}

int ViasLigacao::getTotalkms()const
{
    return this->totalkms;
}

void ViasLigacao::setTempomedio(int tempomedio)
{
    this->tempomedio = tempomedio;
}

int ViasLigacao::getTempomedio()const
{
    return this->tempomedio;
}


ViasLigacao* ViasLigacao ::clone() const{
    return new ViasLigacao(*this);
}

float ViasLigacao::getPrecoportagem() const{
    return 0;
}

bool ViasLigacao :: operator>(const ViasLigacao &v)const{

    if(totalkms > v.totalkms)
    {
        return true;
    }
    return false;

}

bool ViasLigacao :: operator==(const ViasLigacao &v)const{

    if(totalkms > v.totalkms)
    {
        return true;
    }
    return false;

}

const ViasLigacao& ViasLigacao:: operator= (const ViasLigacao& v){
        if(&v != this){
        (*this)=ViasLigacao(v);
    }
    return *this;

}

ostream& operator<<(ostream &o, const ViasLigacao &v)       
{
    v.escrever(o);
    return o;
}

void ViasLigacao :: escrever(ostream &out) const
{
    out << "Local de Interesse inicial:" << locInteresse1 << endl;
    out << "Local de Interesse final:" << locInteresse2 << endl;
    out << "Via de ligação: " << endl;
    out << "Codigo da via: " << codigodavia << endl;
    out << "Total de kms: " << totalkms << endl;
    out << "Tempo medio: " << tempomedio << endl;
}


#endif

任何人都可以帮忙吗? 我收到此错误

Error   6   error LNK2019: unresolved external symbol "public: __thiscall ViasLigacaoAuto::ViasLigacaoAuto(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int,int,float)" (??0ViasLigacaoAuto@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HHM@Z) referenced in function "public: __thiscall ApViasLigacao::ApViasLigacao(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int,int,float)" (??0ApViasLigacao@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HHM@Z)    C:\Users\joaopedro\Source\Repos\1110830_1121107_esinf\MapaDigital\Main.obj  MapaDigital

1 个答案:

答案 0 :(得分:1)

它说它找不到你为ViasLigacaoAuto声明的第三个构造函数(带有string,int,int,float的那个) - 事实上,这个构造函数似乎没有在你的代码。你需要定义它。

(有时,编译器/链接器错误消息会告诉您实际存在的问题。)