2

重複の可能性:
ヘッダーファイルの循環依存の回避

Task.h:

#ifndef Tasks_h
#define Tasks_h

#include "Executors.h"

class Task
{
    Executor *current_executor;
};

#endif Tasks_h

Executor.h:

#ifndef Executors_h
#define Executors_h

#include "Tasks.h"

class Executor
{
    Task *current_task;
};

#endif Executors_h

main.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++をサポートして使用するために最善を尽くしています。
すべてのクラスを1つのヘッダーファイルにコーディングしたくない

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イディオムを使用することです。

.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 に答える