меня есть определённая структура, с ней работают некоторые методы. В унаследованных структурах хочу переопредилить структуру, но сохранить сигнатуру методов и просто переопределить их для работы с новой структурой. Как это можно сделать?
Код здесь: https://bpa.st/SYXQ
Вам надо не переопределить, а сделать наследников для Data.
Так нельзя. Через визитка делай. struct data_proc{ void process(Data1& data_); void process(Data2& data_); ... }; struct Object?{ Data? my_data; virt DoProcess(data_proc& proc_){ proc_.process(my_data); } }
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Тогда method_1()/method_2() не будут компилироваться, так как они возвращают Data *
Указатель на базовый тип нет никаких проблем вернуть, имея указатель на наследника.
Ну ок, допустим, но результаты этих методов будут использоваться внутри наследуемых классов. Что, предлагаете делать dynamic_cast внутри класса на самого себя?
Не на самого себя, а на наследника Data.
можно использовать шаблон
Тоже думал об этом. Но здесь возникает проблема при определении структуры Data. Если её определять в хидере, даже в анонимном неймспейсе, при включении двух заголовков с разными определениями структуры вызовет конфликт имён и ошибку компиляции.
зачем называть разные структуры одинаково?
Наверное придётся попробовать визитор
Нужно сохранить сигнатуру функций method_1()/method_2(), но в сущности они возращают разные структуры
ты не можешь убрать повтор, если у тебя такое условие. Значит принимай шаблон, а возвращай нужную тебе структуру
почитай что такое сигнатура. У тебя методы, в примере, имеют разные сигнатуры, потому что возвращают разные структуры
Ну, так сделать нельзя, так как фактически ты будешь возвращать разные типы данных у виртуальных методов. Единственное, что в чём виртуальные методы могут не совпадать — возвращаемый тип, если это указатель или ссылка и при этом они полиморфны друг другу(ну можно динамик кастом кастить, например функцию clone сделать) Я бы здесь сделал что-то типа struct IData {}; , а далее уже разбирался, каким именно образом там надо будет с этим работать
Обсуждают сегодня