web-dev-qa-db-ja.com

main.cppファイルで引数を受け入れ、別のファイルを参照するにはどうすればよいですか?

私はプログラミングの基本を理解しており、現在C++を学んでいます。私はubuntu用の独自のCLIプログラムを構築する初期段階にあります。しかし、私はいくつかの障害にぶつかり、いくつかの説明を得ることができるかどうか疑問に思いました。私が取り組んでいるプログラムは「sat」と呼ばれ、コマンドラインからのみ利用できます。 main.cppがあります。

ただし、私の本当の質問は、プログラミング/編成の「ベストプラクティス」です。私のプログラム「sat」が呼び出されたとき、私はそれが追加の引数を取ることを望みます。

次に例を示します。

> sat task subtask

整理しやすくするためにタスクを独自のtask.cppファイルに含める必要があるのか​​、それともmain.cppの関数にする必要があるのか​​わかりません。タスクを独自のファイルに含める必要がある場合、main.cppファイルの引数をどのように受け入れ、他のファイルを参照しますか?

どの方法が好ましいかについての考えと、推論をバックアップするための参考資料はありますか?

1
jason.dot.h

.cppコードファイルはすべて同じバイナリ/オブジェクトにコンパイルされるため、ファイルを分離することは開発の便宜に過ぎず、コードをモジュール化できます。コマンドラインパラメータを解析した後、アプリケーションで実行する呼び出しを決定できます。

main()エントリポイント に渡されたargv []配列を介して、アプリケーション引数を反復処理します。

#include <iostream>

int main(int main, char* argv[])
{
        // Check the number of parameters
        if (argc < 2) {
                // Tell the user how to run the program
                std::cerr << "Usage: " << argv[0] << " NAME" << std::endl;
                /* "Usage messages" are a conventional way of telling the user
                 * how to run a program if they enter the command incorrectly.
                 */
                return 1;
        }
        // Print the user's name:
        std::cout << argv[0] << "says hello, " << argv[1] << "!" << std::endl;
        return 0;
}

ベストプラクティスとしては、コマンドラインパーサーを使用して車輪の再発明を行わないことが最善です ここで回答されているライブラリ

2
invert

いくつかの個人的な好みがあり、いくつかのわずかな設計上の利点が含まれます。引数を受け入れて他のモジュール/関数に渡すことは問題ではありません。問題となっているのは、すべてを1つのファイルに保存する場合と比較して、アーキテクチャ全体を分割した場合にどれだけ適切に表現されるかです。

それを分割する主な理由は、それが組織的に意味があるかどうかであるはずです。

DeskおよびPigオブジェクトを処理するプログラムがある場合、Desk関連のすべてのクラス宣言および定義コードを_Desk.h_および_Desk.cpp_に分割できます。 Pigについても同様です。これらのオブジェクトへのインターフェイスが明確に定義されている場合、Deskオブジェクトの実装方法を変更しても、メインプログラムの実行方法は変更されません。しかし今、私はオブジェクト指向設計に取り掛かっています。

私が言っているのは、設計の観点からTaskmain()関数から分割する正当な理由がある場合はそれを行う必要があるということです。あなたの投稿から、あなたが何を達成しようとしているのかよくわかりません。

私の答えの試み以上に役立つかもしれないのは ソフトウェア設計に関するウィキペディアの記事 です。

1
Nick