ネストされたクラスですか、それともネストされたクラスですか?
-
19-09-2019 - |
質問
クラス A と A オブジェクトのリストがあります。A には、X 秒ごとに実行される関数 f があります (最初のインスタンスの場合は 1 秒ごと、2 番目のインスタンスの場合は 5 秒ごとなど)。正しい時間に関数を実行する責任を負うスケジューラ クラスがあります。私がやろうと思ったのは、A インスタンスへの ptr と A::f を実行する時刻を保持する新しいクラス ATime を作成することです。スケジューラは、Atime の最小優先キューを保持します。
- それは正しい実装だと思いますか?
- ATime はスケジューラのネストされたクラスである必要がありますか?
解決
は、あなたが記述するものから、それは仕事ができるように聞こえる: - )
私見クラスATime
は、スケジューラがそのジョブを実行することが必要であり、それは実際にはA.には必要とされない、A(および世界の残りの部分は)さえ知っている必要はありませんA.よりも多くのスケジューラに属しその存在について - 。それは、スケジューラのプライベートネストされたクラスは私のために適切であろう置く
他のヒント
これは少しも高度であってもよいが、ここにも...
高める::関数と のは、スケジューラを実装するために使用することができますバインド::ブーストことこれはあなたのスケジューラは、より汎用的かつ再利用可能になるだろうクラスAについて何を知っている必要はありません。
ここでは、これらのブースト機能がお使いの場合にも使用することができる方法を示すいくつかのサンプルコードは、次のとおりです。
#include <ctime>
#include <queue>
#include <boost/function.hpp>
#include <boost/bind.hpp>
struct Foo
{
void onScheduler(time_t time) {/*...*/}
};
struct Bar
{
void onScheduler(time_t time) {/*...*/}
};
typedef boost::function<void (time_t)> SchedulerHandler;
struct SchedulerEvent
{
bool operator<(const SchedulerEvent& rhs) const {return when < rhs.when;}
SchedulerHandler handler;
time_t when;
};
class Scheduler
{
public:
void schedule(SchedulerHandler handler, time_t when)
{
SchedulerEvent event = {handler, when};
queue_.push(event);
}
private:
std::priority_queue<SchedulerEvent> queue_;
void onNextEvent()
{
const SchedulerEvent& next = queue_.top();
next.handler(next.when);
queue_.pop();
}
};
int main()
{
Scheduler s;
Foo f1, f2;
Bar b1, b2;
time_t now = time(0);
s.schedule(boost::bind(&Foo::onScheduler, &f1, _1), now + 1);
s.schedule(boost::bind(&Foo::onScheduler, &f2, _1), now + 2);
s.schedule(boost::bind(&Bar::onScheduler, &b1, _1), now + 3);
s.schedule(boost::bind(&Bar::onScheduler, &b2, _1), now + 4);
// Do scheduling...
return 0;
}
そのScheduler
がFoo
&Bar
、およびその逆について何も知らないことに注意してください。 Scheduler
が本当に望んでいるすべてはSchedulerHandler
で指定された署名と一致した「コールバック」ファンクタです。
SchedulerEvent
が必要な場合はboost::function
オブジェクトは比較できないので、、物事は少し複雑になります。これを回避するには、イベントを登録するときに「接続」トークンのいくつかの種類を返す必要があります。これは本質的であるBoost.Signalが何をするのか。
この情報がお役に立てば幸いです。
クラスのこの種は、あなたのスケジューラクラス内にネストされたプライベートな構造体を作ったベストですので、あなたは簡単にスケジューラクラス内のすべてのフィールドにアクセスすることができます。 (構造体のすべてのフィールドは、デフォルトでは、公開されている。)
第二部(タイトルに質問)については、IMOそれは完全に好みの問題です。あなただけのようにもスケジューラクラスの定義の中に乱雑さを軽減することを選択し、それを使用してから人々を保つために(detail
のように)警告名とサブ名前空間でのatimeを置くことができます。それはスケジューラのためにのみ有用である場合結局のところ、あまりそれを隠すために多くの必要はありません - 。誰もがとにかくそれを使用したいとしていないです。
おそらくそれは(私はその場合には、ネストがより価値があるかもしれませんが、私はとても入れ子になったし、親クラス、または間のアクセスルールを変更するために起こっているのか、いくつかの噂を聞いたと思う)C ++ 0xの中に異なる場合があります。
一般性のために、あなたはまた、テンプレートを利用したいかもしれません、そしておそらくScheduler<A>
(TimedOperation<A>
を使用)(またはその可能性の改良/汎化の無数)で終わる?