2016-06-03 1 views
0

У меня есть два класса A и B, определенные в A.h, A.cpp и B.h, B.cpp соответственно. Класс A имеет структуру, которую я хочу использовать в функции класса B. Поскольку класс B включен в класс A, я не могу включить класс A в класс B, поскольку это приведет к циклической зависимости. Код для всех файлов приведены ниже: АчC++ pass struct из одного класса в другой класс

#ifndef _A_H 
#define _A_H 
#include B.h 
namespace common { 
    class A { 
    public: 
     static struct strctOfA { 
      float p1 = 2; 
     } structA; 
     void functionOfA(); 
    }; 
} 
#endif // !_A_H 

a.cpp

#include A.h 
using namespace common; 
A::functionOfA() { 
    B b; 
    b.functionOfB(structA); 
} 

Bh

#ifndef _B_H 
#define _B_H 
namespace common { 
    class B { 
    public: 
     functionOfB(??); 
    }; 
} 
#endif // !_B_H 

B.cpp

#include B.h 
using namespace common; 
B::functionOfB(??) { 
     // Want to use structA here;   
} 

Я посмотрел в StackOverflow и нашел thread довольно близко к моей проблеме, однако, они либо не объясняют ответ, либо я не могу понять их решение. Пожалуйста, помогите мне с этим.

Благодаря

Update Благодаря I-V за указание на ошибку и предоставили мне объяснение. Обновление кода сработало для меня. Спасибо всем за предоставление дополнительных знаний моим навыкам кодирования на C/C++. :)

+0

Ваш синтаксис '# include' является сомнительным. Это действительно ваши исходные файлы? –

+1

Это действительно не так сложно. Используйте include guard и включите файлы заголовков для интересующих вас классов. –

+0

Эй, Маркус, я создал похожий сценарий моего кода. @ JonathonReinhart: можете ли вы, пожалуйста, немного разобраться? –

ответ

2

Решение простое, что вы написали, это плохая привычка.

Нет причин включать B.h в A.h, потому что вы не используете какую-либо часть B.h в файле A.h. Лучший способ реализовать его - включить B.h в A.cpp, а не в файл заголовка.

Он будет также решить цикл включает в себя у вас есть ..

В целом, рекомендуется включать файлы в .cpp файл, а не в файлах заголовков, когда вы не используете функции/объекты включенного файла в файле заголовка :)

Кроме того, вы должны использовать #pragma один раз для Windows, или IfNDef что-нибудь еще для того, чтобы быть в безопасности конфликтов

Ах

#ifndef _A_H 
#define _A_H 
namespace common { 
    class A { 
    public: 
     static struct strctOfA { 
      float p1 = 2; 
     } structA; 
    } 
} 
#endif 

a.cpp

#include A.h 
#include B.h 
using namespace common; 
class A { 
    B b; 
    b.functionOfB(structA); 
} 

ПРИМЕЧАНИЯ: от B.cpp включает хиджры

+0

Я включил B.h, чтобы вызвать его функцию. Вы проверите это в A.cpp. Однако, спасибо за совет в более поздней части. Я не знал об этом. –

+0

Но вы не должны ничего внедрять в заголовочном файле! Как вы могли бы назвать функцию в A.h ?? –

+0

Ох! Спасибо, что указали это. :) –

0

Это может быть сделано с форвардными декларациями, если вы abolutely не должны передать его по значению. Но я не могу придумать сценарий, где это не будет работать со ссылками.

хиджры

#ifndef A_H_ 
#define A_H_ 

struct B; 
struct A {void f(B&);}; 

#endif 

a.cpp

#include "B.h" 
void A::f(B & value) {/* do something */ }; 

B.h

#ifndef B_H_ 
#define B_H_ 


struct A; 
struct B {void f(B&);}; 

#endif 

Б.каст

#include "A.h" 
void B::f(A & value) {/* do something */ }; 

Если вам нужно иметь значение В в А только предобъявления вы можете поместить его в указатель, то есть использовать зЬй :: unique_ptr.

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

  • Нет связанных вопросов^_^