2015-03-22 2 views
-1

Извините, если вы видели этот вопрос, прежде чем он еще не получил ответа, по существу в моем коде. У меня есть две структуры, определенные в отдельных заголовках и используемые во всем мире по всему проекту. Я просто хочу использовать обе структуры (которые снова определены в двух отдельных заголовках) в других файлах cpp, а не только те, к которым принадлежит файл заголовка. Ниже приведен пример кода, который я испытал:Использование нескольких структур в заголовочных файлах C++

Class1.h

#include "class2.h" 
    #include <vector> 
    #include <string> 

    struct trans1{ 
     string name; 
    }; 
    class class1 { 

    private: 
     vector <trans2> t2; 

    public: 
     class1(); 
    }; 

class2.h

#include "class1.h" 
    #include <vector> 
    #include <string>   

    struct trans2{ 
     string type; 
    }; 

    class class2{ 

    private: 
     vector <trans1> t1; 

    public: 
     class2(); 
    }; 

ErrorLog:

In file included from class1.h:3:0, 
        from class1.cpp:1: 
    class2.h:21:13: error: 'trans1' was not declared in this scope 
     vector <trans1> t1; 
       ^
    class2.h:21:19: error: template argument 1 is invalid 
     vector <trans1> t1; 
        ^
    class2.h:21:19: error: template argument 2 is invalid 

Я понимаю, что это смешной код в реальном мире, однако это просто что я мог бы продемонстрировать.

Следует отметить, что если я просто прокомментирую объявление вектора t1 или t2 под «private:», код обязательно компилируется. Это просто факт, что я использую вторую структуру.

Любая помощь кому-нибудь? Благодарю.

+1

Можете ли вы поместить структуры «trans» в свой собственный заголовочный файл? –

+0

Возможный дубликат [Использование структуры между классами в C++] (http://stackoverflow.com/questions/29195200/using-a-struct-across-classes-in-c) – erip

ответ

1

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

Сделайте вектор закрытым. Таким образом, ни один файл, содержащий заголовок, не может принудительно генерировать код для неполного класса.

+0

В векторах требуется полное объявление структур , Это не будет работать, если векторы не будут изменены для хранения указателей. –

+0

Я могу подтвердить, что этот метод действительно работает, даже если класс не полностью определен в точке объявления вектора. http://goo.gl/tfpe90 –

+0

Я этого не знал! –

0

вы можете попытаться переслать объявить trans1 в class2.h и trans2 в Class1.h так:

class2.h:

// includes 
struct trans1; 
// rest of your code 

то же самое (но с trans2) в class1. h

Не забудьте добавить Включить стражи в свой код!

  • редактировать: и да, вы должны изменить векторы для хранения указателей, в противном случае он не будет связывать
+0

Я думаю, это хуже, потому что теперь вам нужно беспокоиться о том, как распределять и удалять векторные объекты. –

0

Если Вы должны были сделать это в одном файле .cpp, то решение было бы тривиальным :

struct trans1 { ... }; 
    struct trans2 { ... }; 
    class class1 { ... }; 
    class class2 { .... }; 

Теперь вам просто нужно изменить порядок кода, чтобы получить этот результат во всех единицах перевода. (порядок классов/структур в файле важен)

0

Вам нужно поместить структуры «trans» в свои собственные заголовочные файлы и включить их в файлы заголовков классов.

Вы можете перенаправить объявление, но это потребует изменения вашего вектора для использования указателей. (В этом случае я бы порекомендовал std::vector<std::unique_ptr<trans>>). Это может быть уместно, если ваши структуры большие и сложные.

Главным преимуществом подхода с прямой декларацией является сокращение времени компиляции.Однако, если структуры действительно настолько просты, как в вашем примере, я бы не стал беспокоиться о дополнительных расходах на использование указателей здесь.

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