質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1854閲覧

c++ 関数ポインタについて

Daichi

総合スコア47

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/07/28 17:46

編集2016/07/29 06:16

シミュレータを使ってシミュレーションを行っているのですが、そのシミュレータのプログラムについての質問です。

このシミュレータでは、処理する内容をシミュレーションイベントとして、シミュレーションエンジンに登録すると、シミュレーションエンジンによってイベントの実行が行われます。

(1)の部分で、コンストラクタ内で自身のポインタを渡し、シミュレーションイベントを実行する時に関数を呼び出しているそうです。

関数ポインタを使って、関数を実行しています。→訂正 関数ポインタは使ってませんでした。失礼しました。
・(2)の部分で、シミュレーションエンジンに呼び出す関数(ReSendMSAckEvent)を登録しています。この時に、値も一緒に渡したいのですが、渡し方がわかりません。
・また、このプログラムの動作もよくわからないので、動きも教えていただければありがたいです。
ご教授お願いいたします。

以下、プログラムです。
どちらも同じクラス内で定義されています。
(1)が定義しているプログラム
(2)が関数を実行するときのプログラム

c++

1 //(1) 2 class ReSendMSAckEvent: public SimulationEvent { 3 public: 4 explicit 5 ReSendMSAckEvent(BundleProtocol* initMsAckPtr) 6 : 7 MsAckPtr(initMsAckPtr) 8 {} 9 10 void ExecuteEvent() 11 { 12 MsAckPtr->SendMSAck(); 13 } 14 15 private: 16 BundleProtocol* MsAckPtr; 17 }; 18 19 20//(2) 21simulationEngineInterfacePtr->ScheduleEvent(new ReSendMSAckEvent(this));

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasafumiOkamoto

2016/07/29 02:03 編集

(1)と(2)の関係性について詳細な説明が必要かと思われます。あるいは、サンプルコードの修正が必要です。 また、「関数ポインタ」と書かれていますが、どこに関数ポインタが存在するのか判別できるような情報を追加してください。
Daichi

2016/07/29 06:17

すいません。修正しました。
guest

回答3

0

ベストアンサー

こんにちは。

(2)はScheduleEvent(new ReSendMSAckEvent(this));の間違いではないでしょうか?
間違いではないなら、epistemeさんの仰る通りですので、定義(1)と呼び出し(2)の関係が分かる部分のソースをご提示下さい。

上記間違いでしたら、以下推測です。
ScheduleEvent(new ReSendMSAckEvent(this));を呼び出しているのはBundleProtocolを派生したクラスのメンバ関数だろうと思います。new ReSendMSAckEvent(this)にて、ReSendMSAckEvent(BundleProtocol* initMsAckPtr)コントスラクタが呼ばれ、MsAckPtrにthisが設定されます。

ScheduleEvent()はSimulationEventのポインタ(仮にeventとします)を受け取り、イベント実行条件が成立したら、event->ExecuteEvent()を実行するのではないかと思います。

ExecuteEvent()は、MsAckPtr->SendMSAck();を呼び出しています。ここで、BundleProtocolの派生クラスが持つ仮想関数SendMSAck()が呼び出されます。


【補足】
例えば、thisのクラス名がFooだったとします。
また、(2)を実行している関数をBarだったとします。
更に、SendMSAsck()にint型の値、123を渡したかったとします。
下記のようにFooにメンバ変数Bazを定義して中継させることで、123をBar()からSendMSAck()へ渡せます。

C++

1class BundleProtocol 2{ 3public: 4 virtual void SendMSAsck() 5 { 6 // 省略 7 } 8}; 9class Foo : public BundleProtocol 10{ 11 int Baz; 12public: 13 void Bar() 14 { 1516 Baz=123; // ここで渡したい値を設定 17 simulationEngineInterfacePtr->ScheduleEvent(new ReSendMSAckEvent(this)); 1819 } 20 21 void SendMSAsck() 22 { 23 std::cout << Baz << "\n"; // ここで123を受け取れる。 24 } 25};

投稿2016/07/29 01:10

編集2016/07/29 07:53
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daichi

2016/07/29 06:06

(2)は、自分のミスでした。 Chironianさんの言う通り、ScheduleEvent(new ReSendMSAckEvent(this));が正しいです。
Daichi

2016/07/29 06:27

ScheduleEvent(new ReSendMSAckEvent(this));の時に、this以外にも、値を渡して、 ExecuteEvent()のMsAckPtr->SendMSAck()の、SendMSAckに引数として値を渡す事は可能でしょうか??
Chironian

2016/07/29 06:54

ScheduleEvent(new ReSendMSAckEvent(this));のthisの代りに渡せるものは、BundleProtocolクラスか、これを派生したクラスのインスタンスへのポインタです。 そのクラスは、SendMSAck()という関数を持っている必要があります。SendMSAck()関数は見ても分かるように引数がありません。 しかし、そもそも渡したいパラメータ(仮にparamとします)はどこにあるのでしょうか? ScheduleEvent()を呼び出している関数がparamをアクセスできるのでしたら、paramをthisのクラスのメンバ変数として定義するだけで、SendMSAck()はそれをアクセスできますよ。SendMSAck()はthisのクラスのメンバ関数ですから。 クラスの考え方については、例えば、↓のようなC++入門サイトのクラスの解説を参考にされると良いと思いますよ。 http://www.asahi-net.or.jp/~wv7y-kmr/memo/old/cpp_cls.html
Daichi

2016/07/29 07:34

(1)と、(2)を実行する関数が同じクラスから派生しているクラスに属していて、 SendMSAck()内で定義している変数であれば、 ExecuteEvent()のMsAckPtr->SendMSAck()を、MsAckPtr->SendMSAck("変数名")のように実行できるという事ですか??
Chironian

2016/07/29 07:42

う~ん、すいません。意味が分かりません。 (1)はクラスですので、実行できません。 SendMSAck()は関数ですので、内部で定義している変数を直接外部からアクセスする術はありません。 SendMSAck()はパラメータが定義されていないようにも見えますので、MsAckPtr->SendMSAck("変数名")とすることはできないだろうと思います。 "変数名"は単なる文字列ですから、その変数名がつけられた変数へアクセスすることはできません。 回答に少し補足してみます。
Daichi

2016/07/29 10:09

うまく説明できず、すいませんm(_ _)m 補足ありがとうございます! 補足を見たらなんとかなりました! ありがとうございます!
guest

0

1と2の間に何の関係も見られないため、答えようがありません。

投稿2016/07/28 20:01

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daichi

2016/07/29 06:07

すいません!文章を訂正しました!
guest

0

デバッガという便利なツールがあると思うのですが、それで動作を確認してみてはいかがでしょうか?

投稿2016/07/28 18:41

mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daichi

2016/07/29 06:07

デバッガについて勉強してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問