在包含的头文件中定义要访问的结构的正确方法

时间:2015-10-12 18:07:57

标签: c++ header-files

我有类似以下的内容:

那么header1.h

#include "header2.h"

struct MyStruct
{
    int aVariable;
};

class AClass
{
    AnotherClass m_anotherClass;
}

header2.h

class AnotherClass
{
   AnotherClass(MyStruct & myStruct)
      : m_myStruct(myStruct)
   {

   }
   MyStruct & m_myStruct;
};

当我在header1.h中定义它时,我想知道如何在header2.h中访问MyStruct。 我知道我可以将结构的定义移动到header2.h中,但它的意思并不合适。

我想这样做的唯一原因是因为我希望能够获得存储在a_ariable中的数据,该数据在header1.cpp中得到更新。

3 个答案:

答案 0 :(得分:3)

您需要在header2.h中添加前向声明。

Unable to start EventDrivenSourceRunner: { source:com.cloudera.flume.source.TwitterSource{name:Twitter,state:IDLE} } - Exception follows.
java.lang.NoSuchMethodError: twitter4j.FilterQuery.setIncludeEntities(Z)Ltwitter4j/FilterQuery;
at com.cloudera.flume.source.TwitterSource.start(TwitterSource.java:139)
at org.apache.flume.source.EventDrivenSourceRunner.start(EventDrivenSourceRunner.java:44)
at org.apache.flume.lifecycle.LifecycleSupervisor$MonitorRunnable.run(LifecycleSupervisor.java:251)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

答案 1 :(得分:0)

假设你将header1.h包含在header1.cpp中,你可以将struct定义移动到header2.h中。然后,由于header1.cpp包含header1.h,而header1.h又包含header2.h,header1.cpp也可以访问header2.h中定义的结构和类。

答案 2 :(得分:0)

您可以使用struct MyStruct的前向声明。由于您使用的是引用,因此不需要包含header1.h。如果它们使用结构,那么你将无法在此标题中定义函数内联,因为你需要它的定义。