我有一个带有名为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;
}
答案 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;
}
或者,由于类是如此紧密耦合,您可以考虑在同一标题中定义它们。