私は適切な解決策が見つからない場合があります。テンプレートベースクラスと、そのベースクラスにいくつかの作業を行うマネージャクラスが必要です。ここでは、コード変数のアクセス修飾子:プライベート対プロテクト
class Base;
class Manager
{
public:
void DoSomethingTo(Base * bclass)
{
if(bclass->PrivateVar == 0)
// Some code
}
}
class Base
{
protected:
int PrivateVar;
friend class Manager;
};
template<class T>
class TempBase : public Base
{
private:
Manager * man;
public:
void DoWork()
{
PrivateVar = 0;
man->DoSomethingTo(this);
}
}
私の問題はPrivateVar変数が実際にTempBaseにプライベートにとTempBaseから派生したクラスからづけしてはなりませんが、私はManager::DoSomethingTo()
へのポインタを渡すことができないので、私はベースからそれを導出する必要がありさクラスとベースクラスはPrivateVarを所有していなければなりません。また、私はTempBaseでPrivateVarを使用するので、Baseにプライベートにすることはできません。これにより、TempBaseの子クラスからアクセスできるようになります。
PrivateVarがプライベートメンバーであり、Manager::DoSomethingTo()
からアクセスできるように、TempBaseクラスを作成するにはどうすればよいですか?
おかげ
デザインからは、なぜ「Base」にアクセスする必要があるのかわかりません。どうやら 'PrivateVar'は純粋に' TempBase'のもので、 'Base'に移動して' Manager'がアクセスできるようになっています。私はコードを読んでスパゲッティの皿を解く印象を受けました:/ –
@Matthieu M .:「ベース」にアクセスが必要な理由はあなたが絶対に正しいです。そして、面倒なコードについてはごめんなさい。 –
@Bahadir:技術的な問題を抱えていると、当然設計に反映される傾向がありますのでご安心ください。私は自分自身のいくつかの歪んだデザインを主張することができます、私はまだ維持の名誉を持っていることを願っています:D –