• 締切済み

C++でCのソースを改修

Cで作成したタスクをC++で書き直したいのですが、上手くいきません。 C++に直す理由として、 関数は同じだが、オブジェクトが違うクラスが複数あるため が上げられます。 ご意見お願いします。

みんなの回答

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.4

>ソースコードは諸事情により、掲載できないもので… そのまま書けって言ってるんじゃなくて、 雰囲気を伝えてほしかったのさ。日本語でいくら説明しても難しい。 それから、継承はポリモーフィズムが使いたいときにだけしして、 一部の機能を変更したい、などの場合は委譲を使いましょう。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8539/19413)
回答No.3

>当初は関数をクラス化して継承を用いて改修しようと試みましたが、結局同じ関数を何度も記入することになってしまい全く効率が悪く終わりました。 同一の部分を「基本クラス」として作成しましょう。 この時「出力するアドレスが違うだけで、やってる事は同じ」の場合、コンストラクタ関数にアドレスを渡せるように作れば、オブジェクト生成時に「異なるアドレスでコンストラクト」すれば「出力アドレスごとにオブジェクトで管理」できます。 クラスは1つですから、書く関数も1つです。 で、もし「特定のポートだけ出力方法が違い、あとは一緒」と言うのがあれば、上記で作った基本クラスから派生クラスを作って、特殊処理が必要な出力用関数だけを、オーバーライドして関数を上書きしてしまえば良いのです。 また「関数を呼び出して、入出力アドレス、入出力ポートを切り替えれるように、切り替え関数を用意」しておけば、1つのオブジェクトだけをコンストラクトして「使い回し」も出来ます。 同じ関数を何個も書かなければならなくなった理由は「クラスの継承を上手に使えてない」からだと思います。 基本クラスに関数を1つ書いて、それを継承する継承クラスを派生させていけば「同じ関数は書かなくて良い筈」なんですが。

higumakun
質問者

補足

分かり易いアドバイスをいただきありがとうございました。 実はC++でのコーディングをあまりしたことがないため、完全に知識不足でした。 この改修もかねて明日からの休日にC++の勉強をしてみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

どんなソースコードを書き直したくて、 そのときどんな風にうまくいかないのかを 具体的に書いていただく必要がありそうです。 具体的な回答は具体的な質問から生まれます。

higumakun
質問者

補足

ソースコードとしては、複数のLEDやセンサなどを点灯/消灯、タイマ制御するものです。 操作方法は同じですが、対象となるLEDが異なります。 当初は関数をクラス化して継承を用いて改修しようと試みましたが、結局同じ関数を何度も記入することになってしまい全く効率が悪く終わりました。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

>関数は同じだが、オブジェクトが違うクラスが複数あるため 状況がよくわかりません。 簡単なソースコードでもって説明するとアドバイスを得やすいでしょう。 どういう風に改変して、どう上手くいかないかも補足にどうぞ。

higumakun
質問者

補足

みなさんに同じことを質問されてしまいました。 上記の方の返信を参考にしていただきたいです。 ソースコードは諸事情により、掲載できないもので…

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++で書かれたソースを探しています

    C++初心者です。 これから、SDKでオブジェクト指向を前提に 単純なペイント系のソフトを作成したいと思っています。 しかし、どのようなクラスを作っていけば良いのか いまいち頭の中で整理できていません。 また、作れてたとして、オブジェクト同士の関係を どのようにすれば良いかわかりません。 例えばウィンドウに画像を表示させることを 考えたとき、ウィンドウクラスと画像を扱うクラスを 作ったとして、ウィンドウクラスのメンバに 画像を扱うクラスを入れた方がいいのかなど、 そのへんのことがよくわかりません。 そこで、オブジェクト指向で書かれているC++のソースを 見て勉強したいのですが、何か参考となるソースって ありますか。また参考になるURLなどございましたら 教えていただけると助かります。

  • C++ソースからUMLの設計書を作るには

    C++ソースからUMLを使った設計書を起こしたいです。 設計書等は一切ありません。 総ステップ数12万超です。複数のcppファイルに分かれています。 オブジェクト指向に基づいて開発されているので、クラスからクラスへと更には別のcppファイルへと呼び出されていくので、どこから見ていったら良いか悩んでいます。 まずはクラス図から作った方が良いのでしょうか? C++ソースから設計書を起こすには、どこから手を付けたら良いか、アドバイスお願いいたします。

  • C++のクラスについて

    C++でクラスをmain関数をすっきり書くことを目的に暗中模索中です。 あるファイルでC++のクラスを作ったとします そのクラスのファイルのオブジェクトをmain関数で利用したいのですがオブジェクトの生成をmain関数ではなく他のファイルでしてそれをincludeする形で利用したいのですがどういうコードを書いたらいいか分かりません 考え方や書き方を教えてください

  • c# 関数とメモリ消費

     こんにちは、c#初心者です。  自分は文字通りc#をやっているのですが、先輩がc++をなさっていて、その先輩が言うには「(特にvirtual, abstractの)静的でない関数はメンバ変数と同じようにオブジェクトごとにメモリを消費する」というのです。  関数に対するポインタかそれに近いものを持っているらしいのですが、あるクラスでフィールドを増やすと初期化にかかる時間が増えましたが、関数を増やしても時間は変わりませんでした。  そのため(こんな方法で確かめられるのか分かりませんが)本当に関数がインスタンス毎にメモリを消費するのか気になっています。  どなたか詳しい方がいらっしゃいましたらご意見を伺わせてください。

  • 【c++】関数の仕様を出力

    クラス内で作成している各関数の仕様をファイルとして出力したいです。 Visual studioを使っていると、 ツールで「クラスビュー」や「オブジェクトブラウザ」などで関数の仕様などが出力されると思います。 Visual studio の機能でも、外部ツールの機能でも良いです。

  • C++の文法で分からないことがあります

    C++のコードを解析しているときに分からない部分が出てきたので教えていただきたいのですが... あるクラスのメンバ関数の引数で( {オブジェクト名}*& {変数名} )とあったのですが, *& てなんでしょうか? 参照へのポインタという意味かなとは思うのですがそれはそれで意味が分からないし、これを使うことでどんなことが起こるのか分かりません。 どなたか知っている方教えてください。 あと、objective-c++のリファレンスって存在するのでしょうか?あったらどこにあるのか教えてくださると非常に助かります。 よろしくお願いします。

    • 締切済み
    • Mac
  • Vidual C++ のクラスウィザードについて。

    クラスウィザードでメッセージマップからオブジェクトを選択し、 関数の追加をして、ソースを書いていきますよね? その操作ができません。 オブジェクトが1つも表示されないからです。 この表示の仕方をご存知の方 教えてください。 ちなみにMicrosoft Vidual C++ 6.0です。 よろしくおねがいいたします。

  • VBがオブジェクト指向言語でない理由

    一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

  • C++について

    C++のポイントオブジェクトを持つ関数を呼び出す時の引数の渡し方とログ出力について教えて欲しいです。 extern BOOL Post(Load&m_load,Rout&m_rout,Exit&m_exit, Const char lum, int priority) (Load, Rout, Exitはクラス型) という関数を呼び出すとします。 lumとpriorityは文字と数字を渡せばいいのは分かるのですが、オブジェクトポインタを指定されているLoad, Rout, Exitは何を渡せば正解なのか分かりません。 とりあえずオブジェクト渡せばいいのかと思って Load load; Rout rout; Exit exit; として Post(load, rout, exit,'A', 13) で呼び出してデバッグしたら関数が止まってしまいました。 オブジェクトポインタを引数に持つ場合、何を渡したらいいのでしょうか。 それと止まった関数をステップ実行でどこが止まっているのか見てみたらログ出力のリクエスト待ちのところで止まっていました。 引数がおかしいせいで止まっているのだと思っていましたが他にも原因があるのでしょうか? 本当は自分で解決したいのですがあまり時間がなく、勉強する時間もありません。よろしくお願いします。

  • C++のテンプレート関数やテンプレートクラスをC#で利用するには?

    C++で作成したテンプレート関数やテンプレートクラス をC#で利用したいと考えております。 テンプレート関数やクラスを明示的実体化してコンパイルし、 C++/CLIでラップすればC#でも使えるという話を聞きました。 テンプレートでない通常の関数やクラスの場合は、 http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_01.html で紹介されているのを見つけたのですが、 テンプレート関数やクラスの場合 具体的にC++/CLI側でどのように記述すればよいか分かりません。 例えば、 ---- [test.h] template <class Type1> class Test{ public:   Type1 x;   template <class Type2>   Type1 func(Type2 y){ ... } }; ----- のようなクラスがあった場合、どうすればよいでしょうか。 明示的な実体化の方法とC++/CLIで明示的実体化した関数やクラスが どのような名前になるのかが分かれば上記サイトの方法で いけるのではないかと思っているのですが…。 環境はVisual Studio2005(or 2008)です。 よろしくお願いいたします。