簡體   English   中英

避免在類頭文件中聲明私有函數(C ++)

[英]Avoiding declaring private functions in class header files (C++)

(在C ++中)我有一個類,其結構在頭文件中聲明。 該頭文件包含在許多源文件中,因此當我編輯它時,我需要重新編譯大量文件。

該類有一組私有函數,只在一個源文件中調用。 目前,它們在頭文件的類結構中聲明。 當我添加這種類型的新函數或編輯參數時,它會導致重新編譯大量文件。 我想在其他地方聲明這些函數,這樣只會重新編譯定義和調用它們的文件(以節省時間)。 但是,他們仍然需要能夠訪問內部類變量。

我怎樣才能做到這一點?

使用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的所有私人詳細信息,而不FooImpl Foo的用戶看到任何更改。

無法在主類聲明之外聲明類的成員函數。 所以,如果你想在有問題的類之外聲明可以訪問類的特定實例的成員變量的函數,那么除了將該實例傳遞給函數之外我別無選擇。 此外,如果您希望函數能夠訪問私有變量和受保護變量,則需要將它們放在新類中,並使原始類成為其中的朋友。 例如

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);
}

你在尋找編譯器防火牆 ,又名PIMPL?

創建一個抽象基類,它只包含公共函數,並在標題中引用它。 在其他地方創建您的真實類作為實現。 只有需要創建類的源文件才需要查看實現類頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM