Как иметь две структуры с одинаковым типом и именем в разных заголовочных файлах без конфликтов? - PullRequest
0 голосов
/ 08 июня 2019

У меня уже есть, скажем, struct smallbox с двумя примитивными переменными (int-идентификатором, int-размером).Этот маленький ящик является частью более высоких структур, которые используются для построения, т.е. очередей.

Теперь у меня есть часть проекта, в которой я нашел решение для расширения этого маленького ящика, поэтому в нем есть другая информация, например int cost_to_send_it.Хотя мне не разрешено изменять свои базовые структуры, есть ли способ расширить эту структуру каким-либо образом, например, перегрузкой методов в java или около того?Смогу ли я по-прежнему использовать все операции, которые у меня есть на моих более высоких структурах, с новой структурой smallbox с новым атрибутом внутри вместо старого?

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Это предложение определяет ответ: «[Будет ли] я все еще смогу использовать все операции, которые у меня есть, на моих более высоких структурах, имея вместо этого новую маленькую структурную коробочку с атрибутом цвета вместо старой?» Ответ - нет.

Если используемые заголовки и подпрограммы были совершенно разными, есть некоторые компиляции и компоновки «игр», в которые вы могли бы играть - компиляция одного набора исходных файлов с одним определением структуры и другого набора исходных файлов с другим определениемструктуры и обеспечения того, чтобы они никогда не взаимодействовали в зависимости от определения структуры.Однако, поскольку вы спрашиваете, могут ли операции, определенные с использованием одного определения, использоваться с альтернативным определением, вы заставляете один набор кода использовать оба определения.(Альтернативное решение состоит в том, чтобы спроектировать один исходный файл, чтобы использовать разные имена для его подпрограмм при разных обстоятельствах, и затем вы могли бы скомпилировать его дважды, один раз для одного определения структуры и один раз для другого, а затем вы могли бы использовать «тот жеОперации на разных структурах, но на самом деле это были бы разные подпрограммы с разными именами, выполняющие в некотором смысле «одну и ту же» операцию.)

Хотя вы можете определять структуру по-разному в разных единицах перевода, когда структура илилюбой производный от него тип (например, указатель на структуру) используется с подпрограммой в другом модуле перевода, тип, который подпрограмма ожидает получить в качестве параметра, должен быть совместим с типом, который передается ей в качестве аргументакроме некоторых правил о подписанных типах, добавлении квалификаторов и т. д., которые здесь не помогают.

Для совместимости двух структур между их членами должно быть взаимно-однозначное соответствие.s, которые сами должны быть совместимых типов (C 2018 6.2.7 1).Две структуры с разным количеством членов не имеют однозначного соответствия.

0 голосов
/ 08 июня 2019

есть ли способ расширить эту структуру, как методы перегрузка в яве или около того?

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

Где я все еще смогу использовать все операции что у меня есть на моих более высоких структурах, имея новую структуру smallbox с атрибутом цвета внутри вместо старого?

Я думаю, что вы ищете полиморфизм , а не перегрузка. Обратите внимание, что в Java (и C ++ и других известных мне языках, которые поддерживают это) это основано на отношении типа / подтипа между типами с разными именами. Я не знаю ни одного языка, который позволял бы вам переопределять имена типов и использовать два разных типа, как если бы они были одинаковыми в любом смысле. Конечно, С не делает.

Однако есть несколько альтернатив. Наиболее понятное согласование может включать создание нового структурного типа с другим именем, который содержит экземпляр старого:

struct sb {
    int id;
    int size;
};

struct sb_metered {
    struct sb box;
    int cost;
}

Функции, которые работают в отдельных экземплярах этих объектов по указателю , а не по значению, могут быть легко выполнены:

int get_size(struct sb *box) {
    return sb->size;
}

int get_cost(struct sb_metered *metered_box) {
    return metered_box->cost;
}

int main() {
    struct sb_metered b = { { 1, 17}, 42 };

    printf("id: %d, size: %d, cost: %d\n",
        b.id,
        get_size(&b.box),
        get_cost(&b));
}

Обратите внимание, что это не позволяет вам формировать массивы супертипа (struct sb), которые фактически содержат экземпляры подтипа, а также передавать или возвращать структурные объекты подтипа по значению, как если бы они были объекты супертипа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...