Как уже упоминалось, вы можете удалить свой макрос BASE
, поскольку операторы отменяют указатели.
Я немного прояснил и исправил ваш код и объяснил, где вы идете не так:
#include <stdio.h>
#include <string.h>
struct animal
{
int walk;
int hear;
};
struct bird
{
struct animal *base;
int fly;
};
void display(struct animal *common)
{
printf("All animal details hear=%d walk=%d\n",common->hear, common->walk);
}
int main()
{
struct bird peacock; // removed ptr suffix, since it is not a pointer
struct animal base ;
base.hear=1;
base.walk=1;
peacock.base= &base;
struct bird *peacockptr = &peacock;
peacockptr->fly=1;
printf("base address using peacock struct %p\n", (void *)*(struct animal **)peacockptr); //This is the address of base using peackockptr
printf("base address animal %p\n", (void *)&base); //This is the address of base
display(&base);
display(*(struct animal **)peacockptr);
return 0;
}
Обратите внимание, что адрес peackock
равен адресу первого элемента структуры, который является struct animal *
. Поэтому вы должны привести peacockptr
к struct animal **
(потому что он указывает на первый элемент типа struct animal *
), а затем разыменовать его, чтобы получить адрес base
.
Я думаю, что Вы путаете единственную ответственность с интерфейсной сегрегацией.
С точки зрения интерфейса клиента/сервиса необходимо сохранить наклон контрактов и средний. Посмотрите ниже для примера этого.
На стороне SRP вещей, которые должны быть совершенно внутренними к реализации услуги и клиенту, не должен знать об этом. Если Вы, служебный код является слишком большим, разделяет его на классы. Затем имейте свой служебный код, по крайней мере первоначально, действие как фасад и переведите все вызовы к соответствующим объектам. Позже, у Вас есть опция разделения Вашего сервиса в многочисленные услуги. Но знайте, что SOA и объектно-ориентированное проектирование, хотя перекрытие, являются отдельными и имеют различные требования.
Интерфейсный пример сегрегации: у Нас есть сервис здесь на работе, которую мы используем, чтобы сделать различные функции на некоторых бизнес-объектах. Исходный сервис имел один интерфейс. Как это выросло, мы поняли, что у нас было три семейства методов: персистентность объекта данных, бизнес-обновления, бизнес-анализ. Мы разводимся в три контракта. Наш клиент/сервис реализует все 3, таким образом, единственная вещь, которую мы должны были сделать, была разделена контракт в три, и установите две дополнительных конечных точки в нашей конфигурации WCF. Очень простой.
Надеюсь, это поможет.
Я предложил бы, чтобы Вы слушали этот подкаст на hanselminutes:
ТВЕРДЫЕ принципы с дядей Bob - Robert C. Martin
Это помогло бы понять вещи лучше...