构造函数(方法)不被接受为朋友

时间:2014-12-03 19:03:46

标签: c++ friend

我目前有这样的事情。我想只允许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();

这不起作用,因为错误消息表示条形图是不完整的类型(我认为这意味着它无法找到条形图)。关于如何解决这个问题的任何建议?

1 个答案:

答案 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() } 
{}