saide_a Ответов: 1

Как я могу переслать объявление структуры и иметь для этого более двух реализаций


всем привет
У меня есть структура, которая используется в следующем классе
а мой класс-это база двух других классов
Я хочу знать, могу ли я переслать объявление структуры и иметь другое определение этого в моем двух дочернем заголовке

Что я уже пробовал:

улыбнись этому
//base header
struct forw;
class Base
{
    
}
//header child 1
struct forw
{
   int a;
   char b;
}
class child1::Base
{
}
//header child2

//header child 1
struct forw
{
   int a;
   int c;
}
class child2::Base
{
}

KarstenK

Работайте с различными структурами и указателями на них. Лучше быть точным, как сказал Грифф. Или вы узнаете это "трудным путем" (имея странные ошибки). ;-)

1 Ответов

Рейтинг:
1

OriginalGriff

Не очень хорошая идея, совсем нет.
Да, вы можете это сделать, при условии, что два дочерних класса находятся в отдельных файлах. Но... это очень плохая идея, поскольку две структуры могут иметь разные "физические" размеры (в данном случае они этого не делают, так как первая будет "округлена" до кратного 32 битам в любом случае). А когда у вас будут разные размеры, вы начнете возиться с данными, которые находятся вне структуры, когда вы ее используете. Это может привести к очень непредсказуемым результатам, от случайного повреждения данных до сбоев приложений.

Не делай этого. Просто потому, что вы можете что-то сделать, не означает, что вы должны...


saide_a

на самом деле я хочу этот другой физический размер

OriginalGriff

Нет, не надо - это плохая идея. Если вы хотите разные размеры, то называйте их разными вещами. В противном случае вы получите непредсказуемые эффекты, которые очень трудно проработать и исправить позже.

Почему ты думаешь, что хочешь этого?

saide_a

У меня есть пакет, и моя реализация пакета отличается в моих дочерних классах
и в моем базовом классе я тоже использовал этот пакет,
тогда я собираюсь определить это следующим образом
#define FRAME_PACKET_TYPE(buff) (*((uint8_t*)&buff[0]))
спасибо

OriginalGriff

Не используйте вместо этого объединение в своей структуре:
https://www.tutorialspoint.com/cprogramming/c_unions.htm
Таким образом, распределение памяти, необходимое для структуры, всегда будет правильным: это будет самое большое распределение, которое ей нужно, независимо от того, где вы его создадите.

Это также целая нагрузка менее запутанная, когда вы читаете ее обратно для обслуживания через шесть месяцев...