1

У меня есть класс A и два класса, B и C, наследующий от A.Обходное решение для ifdef/ifndef

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

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

# include "b.hpp" 
# include "c.hpp" 

class User{ 
    ...; 
}; 

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

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

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

ответ

1

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

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

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

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

+0

Я согласен, что они используются очень профессиональными людьми. Я видел код ядра, говорящий 'ifndef', как только я должен был его открыть ^^ Это просто я привык избегать использования его для слишком маленьких приложений, как тот, который я разрабатываю. Угадайте, что мне все равно придется принимать факты (: Спасибо всем за ответы! – Rubens

+1

@Rubens Для * действительно * маленькое приложение, нет необходимости использовать заголовок вообще, но на данный момент защита заголовков - это то, как C++ достигает такой модульности. – Potatoswatter

+0

Мой способ делать вещи: держать включенные заголовки как можно ниже, чтобы улучшить время компиляции, но всегда ставьте охранников, чтобы не заботиться о двойных вложенных включениях. – Mic

2

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

#ifndef MYHEADER_HPP 
#define MYHEADER_HPP 

// ... content 

#endif 

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

+0

ОП прямо сказал, что он открыт для «нестандартных» решений. – congusbongus

+0

@CongXu Извините, я добавил его позже, учитывая ответ пироценда.Я все еще хочу узнать, есть ли для этого какое-нибудь другое решение (: – Rubens