2013-10-02 2 views
3

Предположим, у меня есть 2 заголовочные файлы, расширение файла 1 .ipp и main.cpp файл:разница между использованием .ipp расширения и .cpp файлы расширения

Первый файл заголовка (например, интерфейс в Java):

template<class T> 

class myClass1{ 

public: 


    virtual int size() = 0; 

}; 

второй файл заголовка:

#include "myClass1.h" 



    template<class T> 

    class myClass2 : public myClass1<T> 

    public: 



    { 

      virtual int size(); 


    private: 

     int numItems; 

    }; 

    #include "myClass2.ipp" 

И тогда мой myClass2.ipp файл:

template <class T> 
int myClass2<T>::size() 
{ 

    return numItems; 
} 

Последняя одна моя главная:

#include "myclass2.h" 
void tester() 
{ 
    myClass2<int> ForTesting; 
    if(ForTesting.size() == 0) 
    { 
    //...... 
    } 
    else 
    { 
    //..... 
    } 
} 

int main(){ 

    tester(); 
    return 0; 

} 

MyClass1, myClass2 и myClass2.ipp принадлежат заголовка файла. main.cpp в исходном файле. Каковы преимущества использования этого способа для реализации вашей программы вместо использования только .h и .cpp файлов? И что такое файл расширения .ipp? Разница между .ipp и .cpp?

+0

Это может помочь, по крайней мере, в части вопроса. http://stackoverflow.com/questions/5171502/c-vs-cc-vs-cpp-vs-hpp-vs-h-vs-cxx – asafreedman

ответ

12

TR, DR

.cpp файл представляет собой отдельный блок перевода, то .ipp включается из заголовка и переходит во все единицы перевода, включая этот заголовок.

Объяснение

Перед шаблонами, вы кладете объявления методов в файле заголовка и реализация пошел в .cpp файл. Эти файлы были скомпилированы отдельно как их собственный блок компиляции.

С помощью шаблонов это уже невозможно. Почти все методы шаблонов должны быть определены в заголовке. Чтобы отделить их по крайней мере на логическом уровне, некоторые люди помещают объявления в заголовок, но перемещают все реализации методов шаблона в файлы .ipp (i для «inline») и включают файл .ipp в конце заголовка.

+0

Некоторые сайты используют суффикс «.hpp» вместо «.h» для Файлы заголовков C++; некоторые используют «.h ++», некоторые используют «.H», а некоторые используют «.hxx». YMMV. В одном месте я использовал суффикс «.ipp» для файлов, которые должны были быть скомпилированы с помощью компилятора Intel C++. Хотя компилятор может использовать расширение для различения блока компиляции C vs C++, большинство компиляторов не уделяют им особого внимания. – kfsone

+0

1.Отправить декларации методов в файле заголовка, и реализация перешла в файл .cpp. 2.Отправить объявления в заголовке, но переместите все реализации методов шаблона в файлы .ipp (i для «inline») и включите файл .ip в конце заголовка. Почему некоторые люди выбирают второй? Это лучше? – 14K

+1

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

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