我目前有这样的事情。我想只允许bar
类创建foo
类的实例,因此我将其设为foo
的朋友,并将foo
的构造函数设为私有。
foo.h
class foo
{
friend class bar;
private:
foo()
{
}
}
bar.h
#include "foo.h"
class bar
{
private:
boost::shared_ptr<foo> f;
public:
bar()
{
f = boost::shared_ptr<foo>(new foo());
}
}
以上工作完美无缺。但是,因为foo类的私有成员仅用于bar类的构造函数(用于实例化)。我想将私有可访问性限制为只有bar类的构造函数,所以我决定替换
friend class bar;
用这个
friend bar::bar();
这不起作用,因为错误消息表示条形图是不完整的类型(我认为这意味着它无法找到条形图)。关于如何解决这个问题的任何建议?
答案 0 :(得分:1)
我的第一个建议是考虑更改设计以使用工厂方法来创建foo
。无论是作为静态成员函数还是作为自由函数。
但在极少数情况下,这不是一个选项,以下代码说明了如何完成。
<强> bar.h 强>
#include <boost/shared_ptr.hpp>
#ifndef BAR_H_
#define BAR_H_
class foo;
class bar {
private:
boost::shared_ptr<foo> f;
public:
bar();
};
#endif
<强> foo.h中强>
#include "bar.h"
#ifndef FOO_H_
#define FOO_H_
class foo {
friend bar::bar();
private:
foo() {}
};
#endif
<强> bar.cpp 强>
#include "bar.h"
#include "foo.h"
bar::bar() : f{ new foo() }
{}