2

可能的重复:
避免头文件的循环依赖

任务.h:

#ifndef Tasks_h
#define Tasks_h

#include "Executors.h"

class Task
{
    Executor *current_executor;
};

#endif Tasks_h

执行者.h:

#ifndef Executors_h
#define Executors_h

#include "Tasks.h"

class Executor
{
    Task *current_task;
};

#endif Executors_h

主.cpp:

#include <conio.h>
#include <stdio.h>
#include "Tasks.h"
#include "Executors.h"

int main()
{
    Executor ex;

    return 0;
}

编译错误:

Error   1   error C2146: syntax error : missing ';' before identifier 'current_task'    c:\users\rain\documents\visual studio 2010\projects\text\text\executors.h   8
Error   2   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   c:\users\rain\documents\visual studio 2010\projects\text\text\executors.h   8
Error   3   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   c:\users\rain\documents\visual studio 2010\projects\text\text\executors.h   8

再次......在 C# 中我永远不会遇到这样的问题,但我尽我所能支持 C++ 并使用它。
不想在一个头文件中编写所有类

4

3 回答 3

4

这只是一个例子。可能有指针

如果您可以切换到使用指针,则可以用前向声明替换标头包含:

#ifndef Executors_h
#define Executors_h

class Task;

class Executor
{
    Task *current_task_ptr;
};

#endif Executors_h
于 2012-07-16T10:21:07.600 回答
3

您可以使用前向声明:

//#include "Executors.h"

class Executor;
class Task
{
    std::shared_ptr<Executor> current_executor;
};

另一种方法是使用 pimpl idiom:

在 .h 文件中(没有执行程序头文件/转发声明)

class TaskImpl;
class Task
{
 public:
    Task();
    String getExecutorName();

 private:
    std::unique_ptr<TaskImpl> impl;
    friend TaskImpl;    
};

并在 .cpp

#include "Executors.h"

class TaskImpl {
   public:
   Executor current_executor;
   String getExecutorName() { return current_executor.name; }
};

Task::Task() : impl(new TaskImpl()) {
}

String Task::getExecutorName() { return impl->getExecutorName(); }
于 2012-07-16T10:16:22.783 回答
0

我敢打赌你不知道你实际上在做什么:你有一个任务,其中一部分是执行者,其中一部分是任务……

它不是 C# 或 Java 中的引用。

要执行您实际尝试执行的操作,请结合前向声明使用指针/引用

于 2012-07-16T10:24:52.807 回答