У меня есть класс 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
?
ifndef
действительно хорошая практика. Они помогают вам сделать ваши файлы заголовок автономный.
Вы не хотите какой-то файл A
прекратить компиляцию, потому что вы удалили include
заявление C
где-то в другом файле B
, Так что в этом отношении вы включаете C
в обоих A
а также B
, Может быть A
включает в себя B
, но это не имеет значения. В противном случае вам придется добавить include C
в B
всякий раз, когда вы удаляете include C
от A
,
Так ifndef
действительно хорошие практики и должны быть использованы. В зависимости от вашего компилятора у вас могут быть синтаксические ярлыки, такие как однажды прагма (найти обсуждение Вот) — но имейте в виду, что это не стандартно, даже если поддерживается большинством компиляторов.
Кстати, профессиональный код производства действительно использует ifndef
охранники.
Если вы имеете в виду в заголовочном файле, нет, не существует хорошего, портативного способа сделать это. Стандартно все заголовочные файлы хранятся в формате —
#ifndef MYHEADER_HPP
#define MYHEADER_HPP
// ... content
#endif
Любой другой способ был бы нестандартным и не реальный C ++.
Вы всегда можете использовать #pragma once
.