1

私は次のようなクラスを持っています:

class Parameter {
public:
    Parameter();
    virtual ~Parameter();

    bool parse();

    static int WindowWidth;
    static int WindowHeight;
    ....
};

今、私の主に私は一緒に行きます:

int main(int argc, char *argv[]) {
    Parameter parameter;
    Controller controller;

    parameter.parse("parameter.ini");
    controller.initialise();

    return 0;
}

ここで、Controller オブジェクトで、Parameter クラスの静的メンバーにアクセスする必要があります。したがって、私はちょうどやっています:

Controller::Controller() {
    m_numberOfSweepers = Parameter::NumberOfSweepers;
    m_ticks = Parameter::NumberOfTicks;
    m_window_cx = Parameter::WindowWidth;
    m_window_cy = Parameter::WindowHeight;
}

すべてが正常にコンパイルされます。GDB を取り出すと、パラメーター オブジェクトのパーサー メソッド内で、正しい値が静的メンバー内にあることがわかります。しかし、Controller::Controller() メソッド内では、ゴミが発生するだけです。

私は何を間違っていますか?

前もって感謝します。

編集: Parameter クラスの cpp ファイルで、次のことを行います (メソッドの外側で):

int Parameter::WindowWidth;
int Parameter::WindowHeight;
4

2 に答える 2

1

問題は初期化の順序です。ここでは、コントローラーを作成します。

int main(int argc, char *argv[]) {
  Parameter parameter;
  Controller controller;

これが発生すると、コントローラーのコンストラクターが呼び出され、次の処理が行われます。

Controller::Controller() {
  m_numberOfSweepers = Parameter::NumberOfSweepers; // uninitialized garbage
  m_ticks = Parameter::NumberOfTicks; // uninitialized garbage
  m_window_cx = Parameter::WindowWidth; // uninitialized garbage
  m_window_cy = Parameter::WindowHeight; // uninitialized garbage
}

次に、ini ファイルを解析してパラメータを初期化します。しかし、コントローラーはあなたがそれを行う前にこれらの値を取得しました。コントローラーが静的メンバーへの参照を格納していない限り、それらのガベージ値を保持するだけです。

簡単な修正は、コンストラクターからコントローラーの「初期化」メソッドにコードを移動することです。例えば、

Controller::Controller() : m_numberOfSweepers(0)
                         , m_ticks(0)
                         , m_window_cx(0)
                         , m_window_cy(0)
{
  // now empty
}

void Controller::initialise()
{
  m_numberOfSweepers = Parameter::NumberOfSweepers;
  m_ticks = Parameter::NumberOfTicks;
  m_window_cx = Parameter::WindowWidth;
  m_window_cy = Paramter::WindowHeight;
}

適切な順序で呼び出すと仮定すると、現在の問題は修正されます。ただ、このデザインは少し面倒かもしれません。これらのパラメーターに別のクラスが必要なのはなぜですか?

それに固執したい場合は、ControllerParameters などの一般的ではない名前を付けてみてください。とにかく、頑張ってください。良い1日を!

EDIT これらの静的を初期化することも役立つかもしれません。それらが完全にゴミにならないようにするためです。ゴミはダメです。次のように言ってください。

int Parameter::WindowWidth = 0;
int Parameter::WindowHeight = 0;
于 2013-02-03T01:39:12.877 に答える
1

初期化の順序が間違っています。考えられる方法の 1 つは、主に次のことです。

Parameter parameter;
parameter.parse("parameter.ini");

Controller controller;
controller.initialise();
于 2013-02-03T01:47:53.230 に答える