我對PImpl進行了相當廣泛的使用,並且我發現自己正在揮之不去的是準確初始化Pimpl結構成員的地方。選項是爲Private
結構創建一個構造函數,並在那裏初始化它們,或者在主類的構造函數中初始化它們。在pimpl類中初始化默認值的最佳位置?
myclass.hpp:
class MyClass {
public:
MyClass();
~MyClass();
private:
struct Private; unique_ptr<Private> p;
};
myclass.cpp:
#include "myclass.hpp"
#include <string>
struct MyClass::Private {
int some_var;
std::string a_string;
// Option A
Private() :
some_var {42},
a_string {"foo"}
{}
};
MyClass::MyClass() : p(new MyClass::Private) {
// Option B
p->some_var = 42;
p->a_string = "foo";
}
目前我實在不明白這兩個以外,如果我是,由於某種原因,之間的差異,以想要創建新的Private
對象或將它們複製到某處,然後選擇A可能更可取。它還能夠初始化初始化列表中的變量,以確定其價值。但是,我發現選項B的可讀性更高,可維護性也更高。有沒有什麼東西我沒有看到哪一種可能會以某種方式傾斜秤?
那麼,使用初始化列表的效率稍高一點,但它不會有太大的區別。只要做你發現更可讀的東西。 – 2012-04-02 20:00:58
如果實現類是一個聚合,你可以說'p(new MyClass :: Impl {'a',1,true,{1,2,3}})''。 – 2012-04-02 20:03:20