1

静的メソッドとして定義されたいくつかのユーティリティを持つクラスを使用しています。

QDate SSIMUtils::ConvertSSIMDate(QString s) {
    QDate rtnDt;
    //...conversion code
    return rtnDt;
}

このクラスでいくつかの定数を定義したいと思います。LOW_DATEのようなものを入れることを考えていました

const static QDate LOW_DATE; // Need to set this somewhere to 1/1/1970

残念ながら、int などと言うようにプリコンパイル時に定義することはできません。

const static int SSIMUtils::myI = 4;

setDate メソッドを使用する必要があるためです。

私の質問は、定数には初期化が必要なため、コードごとに設定する必要がある静的な const をどのように定義すればよいかということです。たとえば、.hファイルで定義することを考えていました。

const static QDate LOW_DATE;

次に、.cppファイルの上部で、次のようなことを行います

SSIMUtils::LOW_DATE.setDate(1970,1,1);

しかし、これは構文的に正しくありません。私が最終的にやりたいのは、この定数を他のクラスで使用することです。

if (myQDate.compare(SSIMUtils::LOW_DATE)==0) {
    // do something.
}

実行時に調整する必要がある静的クラスで定数値を設定する正しい方法は何ですか? コンストラクタのような?

4

5 に答える 5

4

コメントで述べたように、QDate には setDate() と同等のコンストラクターがあり、「const」オブジェクトの初期化が可能です。

次の方法で静的定数を宣言する必要があります。

myclass.h:

#include <QDate>

class myclass {
public:
    const static QDate CONST_DATE;
};

myclass.cpp:

#include "myclass.h"

const QDate myclass::CONST_DATE(1970, 1, 1);

QDate の代わりに std::string を使用してこれをテストしました (現在 QT は利用できません)。

于 2013-05-14T08:44:59.133 に答える
3

初期化に必要な情報がどこから来るか、またはいつ入手できるかによって異なります。常に利用可能で型がコピーをサポートしている場合は、初期化された型を返す関数を書くことができます:

namespace {
MyType getInitialized()
{
    MyType results;
    //  ...
    return results;
}
}

static MyType const lowDate( getInitialized() );

コピーをサポートしていない場合は、特殊なコンストラクターを提供して派生させることができます。

class MyTypeInitialized : public MyType
{
public:
    MyTypeInitialized()
    {
        //  ...
    }
};
MyTypeInitialized lowDate;

これには、クライアント コードから真の型をマスクするという欠点がありますが、それ以外はうまく機能します。

後になってまで情報が入手できない場合。たとえば、コマンドライン引数に依存する場合は、2 つinstanceの関数を持つシングルトン イディオムの変形を使用する必要がある場合があります。そのうちの 1 つは初期化に必要な引数を取り、最初に呼び出す必要があります。(または、それはやり過ぎかもしれません。 global を持っていて、std::unique_ptr<MyType const> lowDate;それを の開始時に newed オブジェクトで初期化するだけで十分かもしれませんmain。主な違いはクライアントの構文にあります。)

于 2013-05-14T08:45:16.613 に答える
0

名前が示すように、これは定数であり、一度初期化すると変更できません (すべきではありません)。定数メンバー変数に値を割り当てることができる唯一の場所は、コンストラクター内です (つまり、変なconst_casts はありません)。

于 2013-05-14T08:41:17.680 に答える
0

あなたの QDate は構築するのが簡単かもしれません.静的定数を使用することは、関数が呼び出されるたびにその定数の新しい日付を作成するよりも優れているかもしれません.

質問に答えるために、構築するのが複雑であり、静的定数が最良のアイデアであると仮定しましょう。あなたは簡単に書くことができます:

QDate SSIMUtils::ConvertSSIMDate(QString s) {
    static const QDate LOW_DATE( /* ...construct it... */ );
    QDate rtnDt;
    //...conversion code
    return rtnDt;
}

注: SirDarius が、中間 (+1) なしでこの型を直接構築する方法を説明したように見えますが、グローバル定数は C++ で非常に困難な初期化問題を引き起こすため、関数ローカルの静的定数は一般にグローバル定数よりもはるかに優れています。

これにより、一度初期化される関数 local static が作成され、読み込まれる前と関数が呼び出されるときにスレッドセーフな方法で実行されます。

インスタンスを簡単に構築できない場合は、コピー コンストラクターを使用して初期化してから、アクセサリ関数を作成すると役立つ場合があります。

QDate SSIMUtils::ConvertSSIMDate(QString s) {
    struct F { static QDate Low() { return ...; } };
    static const QDate LOW_DATE(F::Low()); // << initialize the constant using the copy ctor
    QDate rtnDt;
    //...conversion code
    return rtnDt;
}

したがって、SirDarius が function-local-static を使用して提供する構造を使用した短いアプローチは次のとおりです。

QDate SSIMUtils::ConvertSSIMDate(QString s) {
    static const QDate LOW_DATE(1970, 1, 1);
    QDate rtnDt;
    //...conversion code
    return rtnDt;
}
于 2013-05-14T09:06:02.793 に答える