2017-03-16 5 views
-2

クラス内の類似の関数をグループにグループ化して、各名前にその名前を付ける必要はありません。名前空間クラスの代替の範囲内で機能しますか?

私はthis questionを見てきましたが、クラス内に名前空間を持つことはできません。また、強く型付けされたenumを使うことを提案しているthis questionも見てきました。しかし、ここの問題は、これらの列挙型が実際に関数を収容できるかどうかわかりません。

問題がcontextualised:

class Semaphore 
{ 
public: 

    void Set(bool State){Semaphore = State;} 
    bool Get(){return Semaphore;} 
    void Wait() 
    { 
     while (Semaphore) 
     { 
      //Wait until the node becomes available. 
     } 
     return; 
    } 
private: 
    bool Semaphore  = 0;   //Don't operate on the same target simultaneously. 
}; 

class Node : Semaphore 
{ 
public: 
    unsigned long IP = 0;   //IP should be stored in network order. 
    bool IsNeighbour = 0;   //Single hop. 

    std::vector<int> OpenPorts; 
    //Rest of code... 
}; 

現在、NodeClass.Get()は私がセマフォを得ることができる方法です。しかし、これは実際に何が得られるかについての混乱を招いています。私はNodeClass.Semaphore::Get()に類似したものを持っていたいと思います。それ以外の場合は、SemaphoreSet()SemaphoreGet()SemaphoreWait()のような機能を持たなければなりません。

私はちょうどSemaphoreクラスを持っていると思っていました。それを他のクラス内でインスタンス化していますが、継承アプローチを採用することができればそれは良いでしょう。

したがって、は、InheritedClass.Group::Function()のような継承されたメソッドにアクセスできますか?

+0

なぜ:サブクラスにあなたがそれらを基底クラスにSetを呼び出すとき、あなたはおそらく、データメンバを使用する必要がありますし、あなたが説明してきたようにそれに応じてメンバ関数に名前を付けることを期待するものとはかなり異なっていますNodeはセマフォから継承していますか?これは重要。 – immibis

+0

@immibis各ノードにはセマフォ機能が必要です。しかし、セマフォー自体が操作する必要があります。 –

+0

"セマフォ機能を持つためには各ノードが必要です" - セマフォをメンバとして持つのに対し、セマフォを継承する必要があるのはなぜですか?Semaphore MySemaphore; – immibis

答えて

1

あなたが本当にこれを実行したい場合は、サブクラスでのメンバ関数をINGのdeleteことにより、ベースクラス名をコールするユーザーに強制できます。

class Base { 
    public: 
    void Set(bool) { } 
}; 

class Derived : public Base { 
    public: 
    void Set(bool) = delete; 
}; 

int main() { 
    Derived d; 
    // d.Set(true); // compiler error 
    d.Base::Set(true); 
} 

しかし、Setを呼び出すの意味であれば

class Base { 
    public: 
    void Set(bool) { } 
}; 

class Derived { 
    public: 
    void SetBase(bool b) { 
     b_.Set(b); 
    } 
    private: 
    Base b_; 
}; 

int main() { 
    Derived d; 
    d.SetBase(true); 
} 
関連する問題