оператор C ++ <перегрузка с классом и интерфейсом - PullRequest
0 голосов
/ 09 апреля 2020

В настоящее время я работаю над проектом, который считывает почтовые индексы из файла .csv, выполняет вычисление haversine и сохраняет элементы в списке на основе возвращенного радиуса поиска. Переменные почтового индекса определяются через класс и используют интерфейс для реализации в main. cpp

Метод, который отбросил все это, - оператор overload, обеспечивающий сортировку почтовых индексов по алфавиту (для использоваться для сортировки списка в основном. cpp)

Класс почтового индекса;

#ifndef POSTCODE_H_
#define POSTCODE_H_
#include <stdexcept>      // std::out_of_range
#include "IPostCode.h"
#include <string>


class PostCode : public IPostCode {


private:
    int Id;
    std::string Postcode;
    std::string firstTwoChars;
    double Lattitude;
    double Longitude;
    double distanceFromCentre;


public:

    PostCode();
    int getId() override;
    std::string getPostcode() override;
    std::string getFirstTwoChars() override;
    double getLattitude() override;
    double getLongitude() override;
    double getdistanceFromCentre() override;
    bool operator<(const PostCode& right) const override;

    void setId(std::string newId) override;
    void setPostcode(std::string newPostcode) override;

    void setLattitude(std::string newLattitude) override;
    void setLongitude(std::string newLongitude) override;
    void setdistanceFromCentre(double newdistanceFromCentre) override;  
    void clearPostCode() override;
};

PostCode::PostCode() {
    this->Id = 0;
    this->Postcode = "";
    this->Lattitude = 0.0f;
    this->Longitude = 0.0f;

}

int PostCode::getId()
{
    return this->Id;
}

std::string PostCode::getPostcode()
{
    return this->Postcode;
}

std::string PostCode::getFirstTwoChars()
{
    firstTwoChars = Postcode.substr(0, 2);
    return this->firstTwoChars;
}

double PostCode::getLattitude()
{
    return this->Lattitude;
}

double PostCode::getLongitude()
{
    return this->Longitude;
}

double PostCode::getdistanceFromCentre()
{
    return this->distanceFromCentre;
}

void PostCode::setId(std::string newId)
{
    this->Id = std::stoi(newId);
}

void PostCode::setPostcode(std::string newPostcode)
{
    this->Postcode = newPostcode;
}

void PostCode::setLattitude(std::string newLattitude)
{
    this->Lattitude = std::stod(newLattitude);
}

void PostCode::setLongitude(std::string newLongitude)
{
    this->Longitude = std::stod(newLongitude);
}

void PostCode::setdistanceFromCentre(double newdistanceFromCentre)
{
    this->distanceFromCentre = newdistanceFromCentre;
}

void PostCode::clearPostCode() {
    this->Id = 0;
    this->Postcode = "";
    this->Lattitude = 0.0f;
    this->Longitude = 0.0f;
}
bool PostCode::operator<(const PostCode& right) const
{
    return (Postcode.compare(right.Postcode) < 0);
}
#endif 

Код интерфейса;

#ifndef IPOSTCODE_H_
#define IPOSTCODE_H_

#include <string>

class IPostCode {

public:
    virtual int getId() = 0;
    virtual std::string getPostcode() = 0;
    virtual double getLattitude() = 0;
    virtual double getLongitude() = 0;
    virtual double getdistanceFromCentre() = 0;
    virtual std::string getFirstTwoChars() = 0;
    virtual bool operator<(const PostCode& right) const = 0;

    virtual void setId(std::string newId) = 0;
    virtual void setPostcode(std::string newPostcode) = 0;
    virtual void setLattitude(std::string newLattitude) = 0;
    virtual void setLongitude(std::string newLongitude) = 0;    
    virtual void setdistanceFromCentre(double newdistanceFromCentre) = 0;

    virtual void clearPostCode() = 0;
};
#endif

Ошибки.

1. Error    C2259   'PostCode': cannot instantiate abstract class   (This error is for the main.cpp declaration of a PostCode)  
2. Error    C3668   'PostCode::operator <': method with override specifier 'override' did not override any base class methods    (Error within the postcode class)
3. Error    C4430   missing type specifier - int assumed. Note: C++ does not support default-int    
4. Error    C2143   syntax error: missing ',' before '&'    (3 + 4 = Errors within the interface)

Я читал, что ошибки интерфейса связаны с идентификаторами типов, и я должен объявить их как stati c, но это дает больше ошибок. Я предполагаю, что все методы в интерфейсе должны быть переопределены, поскольку они объявили чисто виртуальные методы. (т.е. = 0;). Это не пустой метод, потому что он возвращает значения при импликации.

1 Ответ

0 голосов
/ 09 апреля 2020

Это не разрешает все предупреждения и ошибки компилятора; только operator<.
Удалить объявление operator< из класса IPostCode:

class IPostCode
{

public:
    //--------------------------------------------------------
    //  Remove the function below
    //--------------------------------------------------------
    virtual bool operator<(const PostCode& right) const = 0;

};

Удалить ключевое слово override из класса PostCode:

class PostCode : public IPostCode
{

public:
    //---------------------------------------------------
    //   Remove "override" from the declaration below.
    //---------------------------------------------------
    bool operator<(const PostCode& right) const override;
};

Вы действительно не хотите переопределять операторы сравнения или реализовывать функции сравнения в базовых классах. Когда у вас есть указатель типа базового класса, вы не знаете, на какой дочерний класс он действительно указывает. Вы могли бы сравнивать два разных дочерних класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...