0

だから私はこのクライアント/サーバープログラムをコーディングしています。このコードはクライアント側のものです。クライアントにはオブジェクトのインスタンスがあります

mpqs_sieve *instance_;

ポインターとして作成する理由は、mpqs_sieve には 3 つの引数を取るコンストラクターしかなく、後でインスタンス化する必要があるためです。

クライアントはまずサーバーからデータを取得し、これを使用して instance_ をインスタンス化します。この後、さらにデータを要求し、これを受け取ると (これらは 2 次多項式の 3 つの係数です)、instance_ オブジェクトにこれらを設定する必要があります。ただし、instance_ のメンバー関数を呼び出すと、その関数呼び出し内の instance_ のメンバーの 1 つでアクセス違反が発生します。

ここにコードを投稿しました: on pastebinで、100 行目にエラーが表示されます。呼び出しは 71 行目から、その 21 行目より前に発生します。抜粋は次のとおりです。

class client_protocol {
public:
    static std::string parse_message(
        network_message& msg, mpqs_sieve *instance_)
    {
        // ...
        return set_mpqs_data(m.substr(i+1), instance_);
    }

private:
    static std::string set_mpqs_data(
        std::string data, mpqs_sieve *instance_)
    {
        instance_ = new mpqs_sieve(n, M, FB_count);
        // ...
    }
};

これを解決するためのアイデアはありますか?

4

2 に答える 2

3

instance_変数への参照ではなく、関数へのポインターのコピーを渡しています。に代入するinstance_と、同じ名前のメンバー変数ではなく、ローカル変数が変更されます。

関数パラメータを に変更しますmpqs_sieve *&instance_

于 2010-04-26T11:37:04.927 に答える
0

既存の回答の変数への参照に関するメモは良い点であり、別の潜在的な問題が 1 つあります。

あなたのコードを正しく理解していれば、オブジェクトは 48 行目の set_mpqs_data() 関数で作成されます。set_mpqs_data() 関数がその時間より前に呼び出されていることは確かですか (MPQS_DATA メッセージが処理されています)? そうしないと、set_polynomial_data() を呼び出したときに、instance_ が実際のオブジェクトを指していない可能性があります。

于 2010-04-26T11:45:41.307 に答える