Обходной путь для ifdef / ifndef

У меня есть класс Aи два класса, B а также Cнаследуя от A,

Помимо методов из Aкаждый класс должен предлагать разные вещи, и поэтому я хотел бы поместить их в два разных файла — b.hpp а также c.hpp, поскольку они являются шаблонами со встроенными функциями.

У меня тоже есть класс Userиспользуя оба B а также C классы. В user.cppЯ должен иметь что-то близкое к:

# include "b.hpp"# include "c.hpp"
class User{
...;
};

Что вызвало бы ошибку переопределения компилятора, для чего я держу оба класса B а также C в bc.hpp,

Проблема здесь скорее эстетическая, чем ошибка программирования: я просто не нахожу очень элегантно с помощью ifdef / ifndef директивы в небольших приложениях — они всегда выглядят для меня как решение IDE для людей, управляющих слишком большим количеством модулей, и для тех, кто даже не знает о директивах.

Есть ли (даже нестандартный, но по крайней мере вменяемый) Обходной путь для этого, или я должен придерживаться либо двух разных классов в одном файле и использования ifdef / ifndef?

1

Решение

ifndef действительно хорошая практика. Они помогают вам сделать ваши файлы заголовок автономный.

Вы не хотите какой-то файл A прекратить компиляцию, потому что вы удалили include заявление C где-то в другом файле B, Так что в этом отношении вы включаете C в обоих A а также B, Может быть A включает в себя B, но это не имеет значения. В противном случае вам придется добавить include C в B всякий раз, когда вы удаляете include C от A,

Так ifndef действительно хорошие практики и должны быть использованы. В зависимости от вашего компилятора у вас могут быть синтаксические ярлыки, такие как однажды прагма (найти обсуждение Вот) — но имейте в виду, что это не стандартно, даже если поддерживается большинством компиляторов.

Кстати, профессиональный код производства действительно использует ifndef охранники.

1

Другие решения

Если вы имеете в виду в заголовочном файле, нет, не существует хорошего, портативного способа сделать это. Стандартно все заголовочные файлы хранятся в формате —

#ifndef MYHEADER_HPP
#define MYHEADER_HPP

// ... content

#endif

Любой другой способ был бы нестандартным и не реальный C ++.

2

Вы всегда можете использовать #pragma once.

2