0

私はC++を学んでいて、クラスの使用に非常に慣れており、クラスを使用しようとすると非常に混乱します。既存のコード(構造体を使用)を変換してクラスを使用しようとしています。そのため、何をしようとしているのかはわかっていますが、正しく実行しているかどうかはわかりません。

クラスの関数を使用するときは、最初にクラスのオブジェクトをインスタンス化する必要があると言われました。したがって、メイン関数で試したのは(スニペット)、次のとおりです。

int main()// line 1
{
    string message_fr_client = "test"; //line2

    msgInfo message_processed; //line 3
    message_processed.incMsgClass(message_fr_client); //line 4

    if (!message_processed.priority_check(qos_levels, message_processed)) //line 5
        cout << "failure: priority level out of bounds\n"; //line 6

    return 0; //line 7
}

次の仮定が正しいかどうかを明確にするのを手伝ってもらえますか?コンパイラはエラーを表示していないので、エラーがないのか、その下にエラーが潜んでいるのかはわかりません。

  1. 4行目で、関数incMsgClassは文字列に対して実行されmessage_fr_client、結果(および変更された)を返していmessage_processedますか?
  2. 5行目で、関数priority_checkはで実行されてmessage_processedおり、ブール値を返していますか?
  3. 私のクラス定義には、-getPathの値を変更することを目的とした関数があります。nodePathそれは単に使用するだけの問題message_processed.getPath(/*arguments*/)ですか?

関数が機能することがわかっているので、関数の本体は含めませんでした。クラス関数がどのように相互作用するかを知りたいだけです。もっと明確にできるかどうか教えてください-ここで混乱を解消しようとしています。

これが私のクラスです:

#ifndef clientMsgHandling_H
#define clientMsgHandling_H

#include <list>
#include <map>
#include <queue>

class msgInfo
{
public:
    msgInfo();
    msgInfo(int, int, int, std::string, std::list<int>);

    /*classifying message*/
    msgInfo incMsgClass(std::string original_msg);

    /*message error checks*/
    bool priority_check(int syst_priority, msgInfo msg); //check that message is within qos levels
    bool route_check(std::map<std::pair<int, int>, int> route_table, msgInfo msg); //check that route exists

    void getPath(msgInfo msg, std::map<std::pair<int, int>, int> route_info, int max_hop);

private:
    int source_id;
    int dest_id;
    int priority;
    std::string payload;
    std::list<int> nodePath;
};

#endif
4

4 に答える 4

0

4行目は、文字列message_fr_clientで実行されている関数incMsgClassです。

はい

結果の(そして変更された)message_processedを返しますか?

返されるものが何であれ、戻り値を無視していることになります。関数がconstではないため、オブジェクト自体を変更できます。

5行目では、関数priority_checkがmessage_processedに対して実行されており、ブール値を返していますか?

はい

私のクラス定義には、nodePathの値を変更することを目的とした関数getPathがあります-それはmessage_processed.getPath(/ arguments /)を使用するだけの問題ですか?

メンバー関数がクラスメンバーの1つを変更することを目的としている場合は、その関数をconstとしてマークしないだけです。

于 2013-03-26T09:17:53.720 に答える
0

実装なしではわかりにくい-詳細ですが、ここで説明します。

I. std::stringas値(C ++はデフォルトで値による呼び出し)を渡しているのでstd::string、メソッドでのコピーを取得します。渡したオブジェクトを操作して操作する場合は、次のようなオブジェクトの参照を使用します。

msgInfo incMsgClass(std::string& original_msg); // notice the ampersand

次に、署名を次のように変更できます

void incMsgClass(std::string& original_msg);

合格したものを返却する必要がないためstd::string

II。はい、少なくともあなたの署名によれば

III。node_pathメンバーとしてのみ見ることができます。

すべての質問については、C++-FAQを参照してください。

于 2013-03-26T09:19:48.990 に答える
0

コンパイル(および実行)することもできますが、次のようなコードにはいくつかの奇妙な点があります。-

まず、クラスメソッドは、操作しているオブジェクトを認識しているため、メソッドpriority_checkとメソッドはおそらくパラメータとしてroute_check必要ありません。、msgInfo

たとえば、古い非クラス関数は次のようになります

bool priority_check(int p, msgInfo msg)
{
  return msg.priority < p;
}

しかし、新しいものは次のようになります。

bool msgInfo::priority_check(int p)
{
  return priority < p;
}

また、incMsgClassこれはmsgInfoオブジェクトを返す非静的クラスのメソッドであるため、少し奇妙です。何をすべきかを理解せずに判断するのは難しいですが、この関数は通常のメソッドではなく、実際にはコンストラクターである必要があるようです。

もう1つは、現在msgInfoを値でこれらのメソッドに渡していることです。したがって、メソッドが渡されたmsgInfoを変更する必要がある場合、それは何の効果もありません。一般に、他のメソッドへの参照またはconst参照によってオブジェクトを渡す方が適切です。したがって、前の非メソッドの例に戻ると、実際にはこれであるはずです。

bool priority_check(int p, const msgInfo &msg)
...

msgInfoしかし、私が言ったように、あなたはおそらくとにかくパラメータを必要としないでしょう。

于 2013-03-26T09:20:39.967 に答える
0

あなたの基本的な仮定は正しいです。

message_processed.incMsgClass(message_fr_client); //line 4

この行は正しくありません。msgInfo呼び出す関数は、単にドロップされるだけで返されます。あなたはそれを何かに割り当てる必要があります。しかし、それは通常行われているようではありません。次のように、msgInfoのコンストラクターにする必要があります。

class msgInfo
{
public:
   msgInfo(std::string original_msg);
...
}

それならあなたはそれをこのように呼ぶことができます

msgInfo message_processed(message_fr_client);

その行は、すでに適切に初期化されているmsgInfoを作成します。

クラスインスタンスを作成するための別のパターンがあります-静的作成関数。あなたの場合、incMsgClass静的とマークして、次のように呼び出すことができます

msgInfo message_processed = msgInfo.incMsgClass(message_fr_client);

ここでこのパターンが必要かどうかは非常に疑わしいので、コンストラクターに移動することをお勧めします。

他の機能に関しては、問題はありません。としてマークされていないすべてのメンバー関数はconst、呼び出されたオブジェクトを変更できることに注意してください。したがって、このオブジェクトを明示的に渡す必要はありません。関数の場合、呼び出されるオブジェクトへのポインターは名前で使用できますthis。また、関数は、これらの変数が通常の(非メンバー)関数に対してグローバルであるかのように、すべてのクラス変数にアクセスできます。

于 2013-03-26T09:21:50.780 に答える