我开发了一个类,我们称它为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的公共成员函数?
答案 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
中。