1

グローバル変数(クラスのオブジェクト)を使用して、次のように定義します。

//foo.h
extern class_name obj_name;
//foo.cpp
class_name obj_name("directory of a .ttf file");

main()関数が存在するmain.cppにfoo.hを含めました。

問題は、関数内にないため、そこで初期化することにあまり慣れていないことです。それはオープンに出ています。次のようにオブジェクトを初期化する「init()」関数を呼び出すことをお勧めします。

object_name = class_name(parameters);

main()関数から。

ただし、このクラスはサードパーティのクラスであり、コンストラクターにパラメーターを指定せずに作成されたオブジェクトを受け入れません。たぶん、デフォルトのパラメーターなしコンストラクターがありません。

私が上でしたことをするのは良いコーディングスタイルですか?

4

5 に答える 5

3

いいえ。

非常に正当な理由がない限り、C++でグローバルを使用しないでください。

  • 「静的初期化順序の大失敗」に遭遇します。
  • あなたは醜いスパゲッティコードを取得します。
  • コードのテストは困難になります。

これは、グローバルがサードパーティタイプの場合に特に当てはまります。

遅延初期化を可能にするファクトリメソッドのようなより良いものを使用することを検討してください。または、オブジェクトを必要とする関数にオブジェクトを渡すだけです。

また、そのサードパーティクラスを独自のクラスでラップすることを検討してください。テストに必要な最小限のインターフェイスのみを提供し、その抽象基本クラスへのポインタを使用してください。(または、サードパーティのライブラリがそれをサポートしている場合は、サードパーティが提供する最小限のインターフェイスを使用して、使用を回避できます)

于 2012-07-03T09:41:37.167 に答える
3

初めて使用するイディオムで構築すると、いくつかの心配を省くことができます。

// foo.h

class_name& get_obj();

// foo.cpp

class_name& get_obj()
{
    static class_name obj("dir");
    return obj;
}

別のリンク。

于 2012-07-03T09:51:35.440 に答える
1

グローバル変数はほとんどの場合悪いです。ただし、別のオプションがない場合は(そうですか?)、ポインターを使用することをお勧めします。このようにして、必要な場所にグローバルポインターを定義し、mainまたは他の関数で演算子newを使用して初期化できます。ただし、これにより、オブジェクトを手動で削除する必要があります。

于 2012-07-03T09:43:05.860 に答える
0

もちろん、それは良いコーディングスタイルではありません。ただし、すべてのサードパーティAPIが「正しい方法」で作成されているわけではないため、ルールを曲げる場合があります。そうすれば、少なくとも厳密にコメントできるので、将来、なぜそうしたのかがわかります。

于 2012-07-03T09:44:40.697 に答える
0

たぶん、このようなものが役立つかもしれません:

class ObjectFactory 
{
public:
    static class_name* getObject() 
    {
        if( ptr ) 
            return ptr;
        else
        {
            ptr = new class_name( <args> );
            return ptr;
        }                
    }

private:
    static class_name* ptr;

    ObjectFactory() : ptr(NULL) {}
}

オブジェクトを使用する必要があるときはいつでも、いつでも実行できます。

class_name *p = ObjectFactory::getObject();
于 2012-07-03T09:56:11.980 に答える