循环依赖 - (如何让struct A引用struct B,struct B引用struct A)

时间:2014-10-27 14:41:10

标签: c++ header circular-dependency

我有一个带有名为Vector4的结构的头文件。

(vector4.h)

struct Vector4
{
    float Values[4];

    // ..... methods .....
};

我有一个带有名为Matrix4的结构的头文件。

(matrix4.h)

struct Matrix4
{
    float Values[16];

    // ..... methods .....
};

我想向它们添加一个成员函数,比如multiply(),它将另一个结构作为参数。

我可以轻松地将matrix4.h添加到vector4.h并添加方法multiply()。

如果我然后尝试将vector4.h添加到matrix4.h,我(显然)将获得循环引用。

如果有的话,我该如何解决这个问题?


编辑:

@MikeSeymour,我写了我认为你的意思,但它没有用。

bar.h

#ifndef BAR_H
#define BAR_H

template <typename T>
struct Foo;

template <typename T>
struct Bar
{
    T t;

    T multiply(const Foo<T>& foo) const;
};

#endif // BAR_H

foo.h中

#ifndef FOO_H
#define FOO_H

template <typename T>
struct Bar;

template <typename T>
struct Foo
{
    T t;

    T multiply(const Bar<T>& bar) const;
};

#endif // FOO_H

bar.cpp

#include "foo.h"
#include "bar.h"

Bar<T>::multiply(const Foo<T>& foo) const
{
    return t * foo.t;
}

Foo.cpp中

#include "foo.h"
#include "bar.h"

Foo<T>::multiply(const Bar<T>& bar) const
{
    return t * bar.t;
}

1 个答案:

答案 0 :(得分:1)

您需要在需要引用它的类之前声明每个类:

// vector4.h
struct Matrix4;

struct Vector4
{
    // ...
    void multiply(Matrix4);
};

// matrix4.h
struct Vector4;

struct Matrix4
{
    // ...
    void multiply(Vector4);
};

需要两个类的完整定义的函数定义必须在类定义之外。

如果类实际上是模板,那么这些函数定义必须在头文件中,结构化以便它们出现在两个类定义之后。一种方法是包含另一个标头,标题的定义之后:

#ifndef BAR_H
#define BAR_H

template <typename T>
struct Foo;

template <typename T>
struct Bar
{
    T t;

    T multiply(const Foo<T>& foo) const;
};

#include "foo.h"

template <typename T>
T Bar<T>::multiply(const Foo<T>& foo) const
{
    return t * foo.t;
}

#endif // BAR_H

或者您可以在单独的标题中定义函数;它们只有在包含这些标题时才可用

// bar_multiply.h
#include "foo.h"
#include "bar.h"

template <typename T>
T Bar<T>::multiply(const Foo<T>& foo) const
{
    return t * foo.t;
}

或者,由于类是如此紧密耦合,您可以考虑在同一标题中定义它们。