2016-08-25 2 views
1

Я хотел бы иметь только файлы в формате .cpp, так как я работаю над проектом с большим количеством классов, которые должны будут взаимодействовать друг с другом, и я чувствую, что это немного лучше так как вам не нужно беспокоиться о том, что вы уже включили или нет, я просто не знаю, как это сделать; вот пример:Имея только файл cpp

#include "UnitConverter.hpp" 
#include <string> 
//extern namespace std; 
//extern class std::string; 
//extern class UnitConverter; 
//extern enum UnitConverter::UnitTypes; 
//extern enum UnitConverter::UnitSystem; 
//extern enum UnitConverter::ScalingType; 

class AnalogOutput{ 

    public: 
    std::string name; 
    UnitConverter::UnitTypes unit_type; 
    UnitConverter::UnitSystem unit_system; 
    UnitConverter::ScalingType scaling_type; 
} 

как бы я объявить пространство имен, классы и типы перечислений, так что компилирует без включает в файле HPP, но в файле CPP?

+3

Мне непонятно, почему вы хотите это сделать. –

+4

Почему вы беспокоитесь о том, «что вы уже включили или нет»? Просто включите то, что вам нужно, если вы включите один и тот же заголовок дважды, вот что включает в себя защитники. – user463035818

+1

вы можете в качестве альтернативы форварда объявить все и использовать указатели и ссылки. Но наличие сортированной системы включения с каждым классом, имеющим свой собственный заголовок, кажется более ясным и делает меньше головных болей. После этого вы также можете использовать некоторые инструменты для проверки неиспользуемых включений в случае, если у вас слишком много. – Hayt

ответ

2

std::string сделает его трудным для вас, так как это ЬурейеЕ шаблону ... Лучше не беспокоиться о том, что один - это крайне маловероятно, что вы получите круговой включает в себя с системой заголовков ...

для классов вашего проекта, вы должны объявить их именно так, как они были объявлены в соответствующем их заголовке:

// Example.h 
namespace Dummy 
{ 
    class Example { /* ... */ }; 
} 

И затем, чтобы избежать включает в себя:

// Test.h 
namespace Dummy 
{ 
    class Example; // just the bare name! 
} 

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

// Test.h 
/* ... */ 
class Test 
{ 
    Dummy::Example ex; // type is incomplete! 
    Dummy::Example& ex_r; // reference is OK 
    Dummy::Example* ex_p; // pointer, too 

    inline void foo() 
    { 
     // type incomplete; you cannot do this here: 
     ex_p->bar(); 
     // needs to be done in cpp file where Example.h is included instead 
    } 
}; 
+0

Upvote для затруднения переадресации 'std :: string' - что я не думал о себе ... :) – atkins

+0

@atkins Кажется, что мы должен был написать общий ответ вместе ... – Aconcagua

+0

yep, спасибо большое, ребята, я думаю, что оставлю необходимые включения в hpp-файлы и просто будьте осторожны. @atkins – heczaco

6

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

Использование заголовка catch-all будет убивать время компиляции. Плохо. Не. Делать. Это.

2

Похоже, вы спрашиваете об использовании forward declarations. Для этого синтаксис - это просто class MyClass; (вам не нужны эти префиксы extern).

И вперед объявить класс, который пребывает в пространстве имен, оберните опережающее объявление в пространстве имен:

namespace MyNamespace { 
    class MyClass; 
} 

Однако, есть по крайней мере две большие предостережений здесь отношение к фрагмент кода:

  1. Вы можете использовать только указатели или ссылки вперёд тип объявления. Таким образом, в вашем примере вы не сможете переслать объявление std::string, если вы хотите, чтобы у вас был член std::string в вашем классе AnalogOutput - вам придется изменить этот элемент вместо указателя или ссылки.
  2. You can't forward declare nested types. Таким образом, вы не сможете переслать объявление enums, потому что все они вложены в UnitConverter.
+0

upvote для вложенных типов - что я не думал о себе ... – Aconcagua

Смежные вопросы