Полиморфизм, перегрузка операторов - PullRequest
0 голосов
/ 05 марта 2019

Допустим, у меня есть класс PArr, который хранит массив различных классов StringWrapper, FloatWrapper, IntWrapper - все они являются производными от базового класса Wrapper.

Это класс PArr:

class PArr{
private:
    Wrapper** _wrappers;
    int _size;
public:
    PArr(int size);
    Wrapper& operator[](int index);


};

А вот и реализация этого класса

#include "PArr.h"

PArr::PArr(int size){

    _size = size;
    _wrappers = new Wrapper*[_size];

}

Wrapper& PArr::operator[](int index){

    return _wrappers[index];
}

А вот класс, например, FloatWrapper

#pragma once
#include "Wrapper.h"

class FloatWrapper : public Wrapper{
private:
      float* _floatPtr;
public:
      FloatWrapper(float number);

};   

Мой основной метод выглядит так:

int main() {  
     PArr a(3);

     a[0] = new FloatWrapper(0.1);
}

Я получаю ошибку: "нет совпадения для 'operator =' (типы операндов: 'Wrapper' и 'FloatWrapper *')

Что я делаю не так?

1 Ответ

2 голосов
/ 05 марта 2019

С риском констатировать очевидное: ваш operator[] возвращает Wrapper&, который является ссылочным типом, и вы пытаетесь присвоить Wrapper*, указатель введите его.Это не сработает.

Если вы слегка переписали свою основную функцию, скажем так:

int main()
{  
  PArr a(3);
  auto k = a[0];
}

, вы можете найти ошибку более информативной:

main.cpp: В функции-члене 'Wrapper & PArr :: operator [] (int)':

main.cpp: 27: 27: ошибка: неверная инициализация ссылки типа 'Wrapper &' из выражения типа'Wrapper *'

return _wrappers[index];

       ~~~~~~~~~~~~~~~^

Вместо этого вы можете попробовать что-то вроде этого:

Wrapper*& PArr::operator[](int index)
{
  return _wrappers[index];
}

, который компилируется и запускает ваш исходный main, по крайней мере для меня.Я не даю никаких обещаний.

Наконец, этот ответ не место для углубленных проблем с вашим кодом (используйте умные указатели, используйте стандартные классы контейнеров библиотеки, такие как array или vector, подумайтетакие вещи, как std::any или std::variant), но, знаете, вы должны прочитать об этих вещах.

...