23

(在 C++ 中)我有一个类,其结构在头文件中声明。该头文件包含在许多源文件中,因此当我编辑它时,我需要重新编译许多文件。

该类具有一组仅在一个源文件中调用的私有函数。目前它们在头文件的类结构中声明。当我添加这种类型的新函数或编辑参数时,它会导致重新编译大量文件。我想在其他地方声明这些函数,这样只有定义和调用它们的文件被重新编译(以节省时间)。不过,他们仍然需要能够访问内部类变量。

我怎样才能做到这一点?

4

4 回答 4

14

使用pImpl 习惯用法- 您的可见类保留指向真实类的指针并将调用转发到公共成员函数。

编辑:回应评论

// 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看到任何更改。

于 2011-04-14T15:19:19.153 回答
5

没有办法在主类声明之外声明类的成员函数。因此,如果您想在所讨论的类之外声明可以访问该类特定实例的成员变量的函数,那么除了将该实例传递给函数之外,我别无选择。此外,如果您希望函数能够访问私有变量和受保护变量,您需要将它们放在一个新类中,并使原始类成为它的朋友。例如

标头.h:

class FooImpl;

class Foo {
public:
   int bar();
   friend class FooImpl;
private:
   int var;
}

实现.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);
}
于 2011-04-16T09:37:33.093 回答
2

您在寻找编译器防火墙,又名 PIMPL 吗?

于 2011-04-14T15:20:40.637 回答
1

创建一个仅包含公共函数的抽象基类,并在您的标题中引用它。创建您的真实类作为其他地方的实现。只有需要创建类的源文件才需要查看实现类头。

于 2013-09-12T14:10:49.693 回答