此代碼似乎工作,但我不知道爲什麼:嵌套類構造函數調用私有構造函數,它工作嗎?
#include <iostream>
class Foo {
friend class Bar;
public:
void printNum() {std::cout << num_ << "\n";}
private:
// This constructor is private, should be accessible only to Bar
Foo(int num) : num_(num) {}
int num_;
};
class Bar {
public:
Bar(int num);
void printFooNum();
~Bar();
private:
class Impl_;
Impl_ * pImpl_;
};
struct Bar::Impl_ {
Impl_(int num);
Foo foo_;
};
Bar::Impl_::Impl_(int num)
: foo_(num)
{}
Bar::Bar(int num)
: pImpl_(new Impl_(num))
{}
void Bar::printFooNum() {
pImpl_->foo_.printNum();
}
Bar::~Bar() { delete pImpl_;}
int main() {
Bar bar(5);
bar.printFooNum();
return 0;
}
在這裏,我試圖確保Foo
類的對象可以Bar
類的對象,這是使用實現內部構造pImpl模式。我其實不介意構造函數Bar::Impl_()
顯然能夠調用Foo
構造函數,但我不確定爲什麼這應該起作用。這段代碼是使用幾種不同的編譯器(GCC和Intel)編譯的,它似乎給了我期望的結果,但我不確定這是因爲編譯器是寬容的還是代碼實際上是正確的。
爲什麼它似乎是Bar::Impl_()
可以調用Foo
構造函數時Foo
只結識Bar
而不是Bar::Impl_
?
我想我以前見過的多布斯博士的文章,我從中得到了外賣的是,你說的是隻在C++標準的後續版本真的,不是嚴格的C++ 98 。但是,嘿,如果編譯器對後來的標準支持足夠普及,我會接受。 – jjramsey