Доступ к методам после ошибки наследования

#c #inheritance #base-class

#c #наследование #базовый класс

Вопрос:

Я использую наследование для своего кода. ChangeRequest — мой базовый класс. Код выглядит следующим образом.

ChangeRequest.h

 #include <iostream>
#include <string>

using namespace std;

class ChangeRequest
{
int swapDay;
int newDay;
public:
void setSwapDay(int newDay);
int getSwapDay();

void setNewDay(int newDay);
int getNewDay();
 

};

ChangeRequest.cpp

 #include "ChangeDutyRequest.h"

void ChangeRequest::setSwapDay(int newDay)
{
    swapDay = newDay;
}

int ChangeRequest::getSwapDay()
{
    return swapDay;
}

void ChangeRequest::setNewDay(int day)
{
    newDay = day;
}   

int ChangeRequest::getNewDay()
{
    return newDay;
}
 

Приведенный ниже код предназначен для производного класса. SwapDuty
SwapDuty.h

 #include <iostream>
#include <string>
#include "ChangeRequest.h"

using namespace std;

class SwapDuty: public ChangeRequest
{
    string requester;
    public:
    void setRequester(string member);
    string getRequester();
};
 

SwapDuty.cpp

    #include "SwapDuty.h"

    void SwapDuty::setRequester(string member)
    {
        requester = member;
    }

    string SwapDuty::getRequester()
    {
        return requester;
    }
 

когда я компилирую и получаю доступ к атрибуту requester с помощью getRequester(). Я получаю следующую ошибку.

 'class ChangeRequest' has no member named 'getRequester'
 

Вот как я использовал свой код

Может кто-нибудь, пожалуйста, скажите мне, что я делаю не так? Заранее спасибо

     SwapDuty newSwapDutyRequest;
        for(int i = 0; i < tempList.size(); i   )
        {
            if(tempList[i].getPersonToPerform().getName() == loginMember)
            {
                newSwapDutyRequest.setRequester(loginMember);   
                newSwapDutyRequest.setSwapDay(swapDay);
                newSwapDutyRequest.setNewDutyDay(daySwapWith);
                break;
            }
        }
        changeList.push_back(newSwapDutyRequest);

cout << changeList[1].getRequester() << endl;
 

Ответ №1:

Что такое тип списка изменений?

Хотя вы создали объект производного класса, я подозреваю, что вы помещаете его в контейнер базового класса. Возможно, вы также получаете несколько предупреждений перед этой ошибкой из-за того, что вы помещаете производный объект в контейнер типа base.

Если вы хотите создать контейнер базового класса и вставить объекты производного класса, вам нужно работать с указателями на объекты, а не с самими объектами.

Комментарии:

1. объявить чисто виртуальную функцию getRequester в ChangeRequest классе

Ответ №2:

Где ваш класс ChangeDutyRequest ? Вы этого не показываете. Может быть, вы забыли наследовать его из правильной базы или вызвать его неправильно?

Показать более полный пример кода

Комментарии:

1. извините, ChangeDutyRequest — это ChangeRequest, я неправильно ввел код.

2. Но ChangeRequest не имеет getRequester метода. Наследование с SwapDuty помощью не добавляет метод к базовому классу, только к дочернему классу — вы это понимаете?

3. Объект, который я создаю, принадлежит классу SwapDuty, и я прошу получить запрос от него, и он выдает мне эту ошибку. Но SwapDuty имеет атрибут requester’а.

4. @Peter: но на ошибку жалуются ChangeReqest , поэтому вы делаете это неправильно. Можете ли вы показать код, который вы используете для создания объекта и доступа к методу?

5. @zaharpopov: это не ответ, а комментарий к вопросу, и он должен быть размещен соответствующим образом