如何在C中创建两个使用彼此作为数据的类?
作者:互联网
我正在寻找创建两个类,每个类包含另一个类类型的对象.我怎样才能做到这一点?如果我不能这样做,是否有一个解决方法,比如每个类包含一个指向另一个类类型的指针?谢谢!
这就是我所拥有的:
文件:bar.h
#ifndef BAR_H
#define BAR_H
#include "foo.h"
class bar {
public:
foo getFoo();
protected:
foo f;
};
#endif
文件:foo.h
#ifndef FOO_H
#define FOO_H
#include "bar.h"
class foo {
public:
bar getBar();
protected:
bar b;
};
#endif
文件:main.cpp
#include "foo.h"
#include "bar.h"
int
main (int argc, char **argv)
{
foo myFoo;
bar myBar;
}
$g main.cpp
In file included from foo.h:3,
from main.cpp:1:
bar.h:6: error: ‘foo’ does not name a type
bar.h:8: error: ‘foo’ does not name a type
解决方法:
你不能让两个类直接包含另一个类型的对象,因为否则你需要为该对象提供无限空间(因为foo有一个带有foo的bar,它有一个bar等)
但是,您可以通过让两个类存储指向彼此的指针来实现此目的.为此,您需要使用前向声明,以便两个类知道彼此的存在:
#ifndef BAR_H
#define BAR_H
class foo; // Say foo exists without defining it.
class bar {
public:
foo* getFoo();
protected:
foo* f;
};
#endif
和
#ifndef FOO_H
#define FOO_H
class bar; // Say bar exists without defining it.
class foo {
public:
bar* getBar();
protected:
bar* f;
};
#endif
请注意,两个标头不相互包含.相反,他们只是通过前向声明知道其他类的存在.然后,在这两个类的.cpp文件中,您可以#include另一个标头以获取有关该类的完整信息.这些前向声明允许您打破“foo needs bar needs foo needs bar”的引用周期.
标签:c,class,pointers,header-files 来源: https://codeday.me/bug/20190918/1810614.html