Как реализовать интерфейс в C ++ - PullRequest
0 голосов
/ 13 января 2020

У меня есть задание и я пытаюсь что-то понять. У меня есть инструкция по созданию двух интерфейсов: IComparable и IPrintable. Кроме того, мне нужно создать шаблон с именем Interval.

Мне дана функция main, и мне нужно соответствующим образом реализовать эти классы, чтобы она работала как положено.

Это функция, которую я сейчас реализую (в комментариях показано, как должен выглядеть ввод):

void testDate() {
    Date independence(14, 5, 1948);

    cout << independence << endl;

    Date otherDate = independence;

    cout << "Independence:" << independence << ", Other: " << otherDate << endl; // Independence:14/05/1948, Other: 14/05/1948
    otherDate.setMonth(2);
    cout << "Other date: " << otherDate << endl; // Other date: 14/02/1948
    otherDate.setDay(29);
    cout << "Other date: " << otherDate << endl; // Other date: 29/02/1948
    otherDate.setYear(1947);
    cout << "Other date: " << otherDate << endl; // Other date: Not a leap year

    otherDate = Date(24, 1, 1959);
    cout << "Other date: " << otherDate << endl; // Other date: 24/01/1959

    cout << "Comparing using polymorphism" << endl; // Comparing using polymorphism
    IComparable<Date> *indP = dynamic_cast <IComparable<Date> *> (&independence); 

/* --------------------------- ^^^ Stuck in the line above ^^^ --------------------------- */

    cout << "Is independence <= otherDate ? " << (*indP <= otherDate) << endl; // Is independence <= otherDate ? true

    IComparable<Date> *otherP = dynamic_cast <IComparable<Date> *> (&otherDate);
    cout << "Is other date <= independence ? " << (*otherP <= independence) << endl; // Is other date <= independence ? false

}

Если вы посмотрите на код, вы увидите, где я застрял, и это моя проблема: насколько я знаете, этот тип письма использует шаблоны. Но в инструкции IComparable называется интерфейсом, а не шаблоном.

Как я могу реализовать это с помощью интерфейса? Могу ли я реализовать его с помощью интерфейса?

Это моя дата. cpp:

#include <iostream>
#include "Date.h"
#include "IComparable.h"

using namespace std;

void Date::setDay(int d) { day = d; }
int Date::getDay()  const { return day; }
void Date::setMonth(int m) { month = m; }
int Date::getMonth() const { return month; }
void Date::setYear(int y) { year = y; }
int Date::getYear() const { return year; }

Date::Date(int d, int m, int y) {
    setDay(d);
    setMonth(m);
    setYear(y);
}

void Date::operator= (const Date& other) {
    day = other.getDay();
    month = other.getMonth();
    year = other.getYear();
}

void Date::toOs(ostream& output) const {
    // TODO : Check if leap year!
    output << getDay() << "/" << getMonth() << "/" << getYear();
}

bool Date::isLeapYear(int yearToCheck) const {
    if (yearToCheck % 4 == 0)
    {
        if (yearToCheck % 100 == 0)
        {
            if (yearToCheck % 400 == 0)
                return true;
            else
                return false;
        }
        else
            return false;
    }
    else
        return false;
    return false;
}

1 Ответ

1 голос
/ 13 января 2020

Что не работает?

Давайте избавимся от проблемы с вашей строкой: вам не нужно dynamic_cast для реализации полиморфизма. dynamic_cast следует использовать только в очень специфических c случаях. И приведение к успеху требует некоторых наследственных отношений между исходным и целевым типами (здесь Date и IComparable<Date>). К сожалению, без определений классов и сообщений об ошибках дальнейшие рекомендации невозможны.

Что такое интерфейс?

Вы правы: IComparable<Date> - это шаблон, а не интерфейс.

Интерфейсы не являются функцией языка C ++. Но есть общее понимание того, что это такое: это класс без функциональности, который должен обещать поведение, которое будет реализовано другими классами. Стандарт C ++ описывает это следующим образом (в примечании к футу, поэтому он только ориентировочный):

Абстрактный класс также можно использовать для определения интерфейса, для которого производные классы предоставляют множество реализаций

Функции должны быть виртуальными, чтобы получить поведение полиморфа c. Кроме того, абстрактные классы - это классы, которые имеют чисто виртуальные функции (то есть функции, которые не определены) и поэтому никогда не могут быть реализованы напрямую.

Следующие шаги?

Общая идея будет такой:

 class IComparable {
 public:  
    virtual bool is_equal(const IComparable &a, const IComparable &b) = 0;  
    virtual bool is_lesser(const IComparable &a, const IComparable &b) = 0;  
    ... // whetever else you want
    virtual ~IComparable(){};    // good practice: one virtual function -> virtual destructor
 };  

Затем вы можете позволить Date реализовать это:

class Date : public IComparable {
public:
    bool is_equal(const IComparable &a, const IComparable &b) override; 
    ... // you SHOULD override all the pure virtual of the interface
}; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...