(在C ++中)我有一个类,其结构在头文件中声明。该头文件包含在许多源文件中,因此当我编辑它时,我需要重新编译大量文件。
该类有一组私有函数,只在一个源文件中调用。目前,它们在头文件的类结构中声明。当我添加这种类型的新函数或编辑参数时,它会导致重新编译大量文件。我想在其他地方声明这些函数,这样只会重新编译定义和调用它们的文件(以节省时间)。但是,他们仍然需要能够访问内部类变量。
我怎样才能做到这一点?
答案 0 :(得分:14)
使用pImpl idiom - 您的可见类保留指向真实类的指针,并将调用转发给公共成员函数。
编辑:回应评论
// Foo.h:
class FooImpl; // Do *not* include FooImpl.h
class Foo {
public:
Foo();
~Foo();
//.. also need copy ctor and op=
int bar();
private:
FooImpl * Impl;
};
// FooImpl.h:
class FooImpl {
public:
int bar() { return Bar; }
private:
int Bar;
};
// Foo.cpp:
#include "FooImpl.h"
Foo::Foo() { Impl = new FooImpl(); }
Foo::~Foo() { delete Impl; }
int Foo::bar() { return Impl->bar(); }
在FooImpl
- Foo
中保持班级的实际实施应该包含FooImpl
的公共成员的副本,并简单地将调用转发给这些成员。所有用户仅包含“Foo.h” - 您可以更改FooImpl
的所有私人详细信息,而Foo
的用户不会看到任何更改。
答案 1 :(得分:4)
无法在主类声明之外声明类的成员函数。所以,如果你想在有问题的类之外声明可以访问类的特定实例的成员变量的函数,那么除了将该实例传递给函数之外我别无选择。此外,如果您希望函数能够访问私有变量和受保护变量,则需要将它们放在新类中,并使原始类成为其中的朋友。 E.g。
header.h:
class FooImpl;
class Foo {
public:
int bar();
friend class FooImpl;
private:
int var;
}
impl.cpp:
#include "header.h"
class FooImpl {
public:
int bar(Foo &);
}
int FooImpl::bar(Foo &foo) {
return foo.var;
}
int Foo::bar() {
return FooImpl::bar(*this);
}
答案 2 :(得分:2)
您在寻找Compiler Firewall,a.k.a。PIMPL?
答案 3 :(得分:1)
创建一个抽象基类,它只包含公共函数,并在标题中引用它。在其他地方创建您的真实类作为实现。只有需要创建类的源文件才需要查看实现类头。