#c
#c
Вопрос:
Я унаследовал некоторый код, который использует серию POD-структур, и хотел бы предоставить им всем общий базовый класс, чтобы я мог хранить их в общей системе.
Я должен упомянуть, что эти структуры используются в качестве классов взаимодействия с C #, поэтому мне нужно сохранить их свойства POD и aggregate.
Так довольно просто, например, ранее
struct A {
char *id;
float *matrix;
}
struct B {
char *id;
int some_property;
}
В настоящее время часто используются списки инициализаторов во всем коде:
B myB{ otherthing.id, otherthing.property };
и я хочу сделать их все Base
:
struct Base {
};
struct A : public Base {
char *id;
float *matrix;
}
struct B : public Base {
char *id;
int some_property;
}
что теперь нарушает поведение списка инициализаторов. Есть ли способ сохранить текущий код инициализации?
Комментарии:
1. Вероятно, самым простым решением было бы перейти на C 17, который позволяет агрегировать с базовыми классами. Если нет, я полагаю, вы могли бы заставить его работать с C 14, добавив как конструктор по умолчанию, так и конструктор с параметрами для инициализации. Или то же самое в C 11, если
Base
пусто, как в примере, который вы показываете. Но я не чувствую себя достаточно компетентным, чтобы ответить на этот вопрос, извините.2. Я использую C 17, но приведенный выше пример списка инициализаторов не компилируется, поскольку он пытается преобразовать a
char*
в aBase
.3. Хм, своеобразно. Похоже, что вам нужно
B myB{ {}, otherthing.id, otherthing.property };
инициализироватьBase
(или, по крайней мере, GCC с радостью принимает его в этой форме). Поэтому я предполагаю, что вам нужны эти конструкторы, чтобы заставить его работать без изменения инициализации. Классы не будут агрегатами, но все равно будут POD. wandbox.org/permlink/IWLTACHv7x25FAZx