Задать вопрос
vusalg
@vusalg
Студент программист, второй курс

Наследование С++, виртуальные функции, как описать виртуальную функцию, которая принимает/возвращает тип производного класса?

Есть базовый класс А и производный от него B.
В производном классе перегружен operator -, который принимает и возвращает значение типа класса B.

Сам код очень большой, по этому приведу часть, относящуюся к ошибке:

String.h

#ifndef STRING_H
#define STRING_H

#include <iostream>
#include <cstring>

using namespace std;

class String
{
    protected:
            char *str;
            unsigned int size;
    public:
            virtual StringIdentifier operator-(const StringIdentifier &STR){}; 
             //ошибка в этой строке 
            "include/String.h|74|error: ‘StringIdentifier’ does not name a type"

            virtual String operator-(const char *STR){};
            virtual String Invert(){};
            virtual String TransferCase(){};
            virtual char* FirstSymbolOccurrence(const char c){}
};

#endif // STRING_H


StringIdentifier.h
#ifndef STRINGIDENTIFIER_H
#define STRINGIDENTIFIER_H

#include <iostream>
#include <cstring>

using namespace std;

class StringIdentifier : public String
{
    public:
            /* Перегрузка операции '-' при вычитании из объекта класса строки */
            String operator-(const char *STR)
            {
                cout<<"ПЕРЕГРУЗКА ОПЕРАЦИИ '-' [1] [class StringIdentifier]"<<endl;
                int i, j, k;

                for(i=0; str[i]!='\0'; i++)
                {
                    for(j=0; STR[j]!='\0'; j++)
                    {
                        if(str[i]==STR[j])
                        {
                            for(k=i+1; str[k]!='\0'; k++)
                                str[k-1]=str[k];
                            size--;
                            str[size]='\0';
                            i--;
                        }
                    }
                }
                return *this;
            }

            /* Перегрузка операции '-' при вычитании из объекта класса другого объекта данного класса */
            StringIdentifier operator-(const StringIdentifier &STR)
            {
                cout<<"ПЕРЕГРУЗКА ОПЕРАЦИИ '-' [class StringIdentifier] [2] "<<endl;
                int i, j, k;

                for(i=0; str[i]!='\0'; i++)
                {
                    for(j=0; STR.str[j]!='\0'; j++)
                    {
                        if(str[i]==STR.str[j])
                        {
                            for(k=i+1; str[k]!='\0'; k++)
                                str[k-1]=str[k];
                            size--;
                            str[size]='\0';
                            i--;
                        }
                    }
                }
                return *this;
            }

            /* Метод перевода букв из верхнего регистра в нижний */
            String TransferCase()
            {
                cout<<"МЕТОД: ПЕРЕВОДА БУКВ ИЗ ВЕРХНЕГО РЕГИСТРА В НИЖНИЙ [class StringIdentifier]"<<endl;
                int i;
                for(i=0; str[i]!='\0'; i++)
                    {
                        if((str[i]>64 && str[i]<91))
                            str[i]+=32;
                    }
                return *this;
            }

            /* Метод поиска первого вхождения символа в строку. Возвращает указатель на ту часть строки, где впервые встретился символ */
            char* FirstSymbolOccurrence(const char c)
            {
                cout<<"МЕТОД: ПОИСК ПЕРВОГО ВХОЖДЕНИЯ СИВОЛА В СТРОКУ [class StringIdentifier]"<<endl;
                return strchr(str,c);
            }

};

#endif // STRINGIDENTIFIER_H
  • Вопрос задан
  • 396 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Исходный код и текст ошибки в студию.

Ок.
include/String.h|74|error: ‘StringIdentifier’ does not name a type

Добавьте строку
class StringIdentifier;
перед началом определения class String.

virtual StringIdentifier operator-(const StringIdentifier &STR){};

-- это не валидный С++, поскольку в реализации нет оператора return.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы