在嵌套类中调用私有函数

时间:2013-12-02 03:46:13

标签: c++

我开发了一个类,我们称它为foo。在头文件中,我选择了一个包含private:部分中所有foo私有成员的类。这样,如果我必须编辑foo的任何私有成员,我不必重新编译每个使用foo.h的源文件。它设置如下:

#ifndef FOO_H
#define FOO_H

class fooData;

class foo
{
   private:
      fooPrivate *prv; // This class stores foo's private members
   public:
      foo(); // Default constructor
      void bar();
}

#endif

我的foo.cpp类看起来像这样:

#include "foo.h"

class fooPrivate // Class which stores foo's private members
{
   public:
      void doMagic();
}

foo::foo()
{
   prv = new fooPrivate; // Instantiate fooPrivate
   prv->doMagic();
}

void foo::magic() // This is a public member function of foo
{
   std::cout << "Magic!" << std::endl;
}

void fooPrivate::doMagic() // This is a function of private member fooPrivate
{
   magic(); // I want to call a public member of foo here
}

你们大多数人都已经知道我试图从doMagic()调用magic()时会遇到的错误:

error: 'magic' was not declared in this scope

并且,将调用更改为foo :: magic()会导致:

error: cannot call member function 'void foo::magic()' without onject

现在,我真的想避免在类型为fooPrivate的对象中实例化foo类型的对象,fooPrivate类型的对象本身是由foo类型的对象实例化的...所以,有没有办法调用< em> public 成员函数magic()来自fooPrivate的公共成员函数?

1 个答案:

答案 0 :(得分:3)

创建fooPrivate时,将对foo的引用作为构造函数的一部分传递:

foo::foo()
{
  prv= new fooPrivate( * this) ;
}

class fooPrivate
{
  foo & foo_ ;
  ...
}

fooPrivate::fooPrivate( foo & aparen) : foo_( aparen ) { }

然后在doMagic()中通过引用来调用它:

void fooPrivate::doMagic()
{
  foo_.magic() ;
}

另外,将fooPrivate存储在unique_ptr中,这样当foo被销毁时,fooPrivate会随之被销毁:

class foo
{
  private:
    std::unique_ptr<fooPrivate> prv ;

为方便起见,您可以初始化如下:

foo::foo() : prv( new fooPrivate( * this ) ) { }

顺便说一句,我不建议在构造函数内部调用prv->magic(),如果它随后通过调用foo回调到仍在创建的doMagic中。