2017-04-24 70 views
1

我正在實現一個C++應用程序,其中還使用了Poco庫。具體而言,我試圖使用poco日誌框架。我已經創建了一個使用下面的代碼從POCO的例子之一,以創建一個日誌機制類:繞過錯誤C2248的有效方法「無法訪問在類中聲明的受保護的成員」

AutoPtr<PatternFormatter> pPatternFormatter(new PatternFormatter()); 
AutoPtr<FormattingChannel>pFormattingChannel(new 
FormattingChannel(pPatternFormatter)); 

pPatternFormatter->setProperty("pattern", "%s: %p : %t"); 

AutoPtr<ConsoleChannel> pConsoleChannel(new ConsoleChannel()); 
pFormattingChannel->setChannel(pConsoleChannel); 

然而,當我試圖與POCO SharedPtr指針來代替POCO AutoPtr 我得到下面的生成錯誤:

錯誤C2248「波科:: FileChannel ::〜FileChannel」:不能訪問類中聲明保護成員「波科:: FileChannel」

我已搜查,發現FileChannel類有它的析構保護我假設使用它以防止通過指向其基地的對象的刪除。 讓我的類從FileChannel派生出來,使用公共或受保護的訪問說明符爲SharedPtr工作或以其他方式工作是否有效?

回答

2

出於好奇,我想到了:如果派生類讓析構函數簡單地公開,那該怎麼辦?其實,這聽起來太簡單了,但我相信它應該可以工作。

樣品test-prot-dtor.cc

#include <iostream> 

class Base { 

    public: 
    Base() { std::cout << "Base::Base()" << std::endl; } 
    protected: 
    virtual ~Base() { std::cout << "Base::~Base()" << std::endl; } 
}; 

class Derived: public Base { 

    public: 
    Derived() { std::cout << "Derived::Derived()" << std::endl; } 
    virtual ~Derived() { std::cout << "Derived::~Derived()" << std::endl; } 
}; 

int main() 
{ 
#if 0 // Does not work! 
    Base *pBase = new Derived; 
    delete pBase; 
    /* here: 
    * error: 'virtual Base::~Base()' is protected 
    */ 
#endif // 0 
    Derived *pDerived = new Derived; 
    delete pDerived; 
    // done 
    return 0; 
} 

測試用的VisualStudio 2013(快遞)和海灣合作委員會在Cygwin中在Windows 10(64位)。下面與後者的樣本會話:

$ g++ --version 
g++ (GCC) 5.4.0 

$ g++ -std=c++11 -c test-prot-dtor.cc 

$ ./test-prot-dtor  
Base::Base() 
Derived::Derived() 
Derived::~Derived() 
Base::~Base() 

$ 

關於你的想法(讓SharedPtr派生類的朋友)我不知道。它取決於SharedPtr的實施細節,即它是「自己完成工作」還是將其委託給另一個(最終甚至是隱藏的)類/方法或功能......

相關問題