2017-04-24 8 views
1

私はC++アプリケーションを実装していますが、私はPocoライブラリも使用しています。具体的には、私はポコロギングフレームワークを使用しようとしています。私は、ロギングメカニズムを作成するために、POCO例の一つから、次のコードを使用するクラスを作成しました:私はPOCO SharedPtrポインタ でPOCO AutoPtrを交換しようとしたとき効率的なバイパス方法エラー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); 

は、しかし、私は次のビルドエラーが出ます:

エラーC2248「ポコ::のFileChannel ::〜のFileChannel」:クラスで宣言され保護されたメンバーにアクセスすることはできません「ポコ::のFileChannel」

私は検索とのFileChannelクラスは、そのデストラクタが保護していることを発見しました私が使用していると仮定しているそのベースへのポインタを介したオブジェクトの削除を防止するためである。 SharedPtrが公開されているか保護されているアクセス指定子を使用してFileChannelから派生させるか、別の方法でクラスを作成するのが効率的ですか?

答えて

2

私は考えました:派生クラスがデストラクタを単に公開するとどうなりますか?実際、それは簡単すぎると思うが、私はそれがうまくいくはずだと信じている。

サンプルtest-prot-dtor.cc:VisualStudioを2013(エクスプレス)およびWindows 10上のcygwinでgccの(64ビット)でテストされて

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

。後者のサンプルセッションの下には:あなたのアイデアについて

$ 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の実装の詳細、すなわち「自分自身で行う」か、それを別の(たとえ隠れた)クラス/メソッドまたは関数に委譲するかによって異なります。

関連する問題