0

もう一度ここでサポートを求めます。

たとえば、私はfpと呼ばれるこのfopenのものを持っています

FILE * fp;

fp=fopen("Entity.dat","wb");

そして、私はx関数を持っていて、それらすべてでこのことを使用する必要があるので、問題はどうすればそれをパブリック/グローバルスコープにすることができるかです.

4

3 に答える 3

7

理想的には、それを使用する必要がある関数にパラメーターとして渡すだけです。

void func( FILE *f, ... )
{
  // do something with f
}

int main( void )
{
  FILE *fp = fopen( "Entity.dat", "wb" );
  ...
  func( fp, ... );
  ...
}
于 2013-04-22T16:19:37.057 に答える
-1

選択肢がある場合は、パラメーターとして渡してください。本当に選択肢がない場合は、シングルトンについて検討できます。

c++11

template<typename T>
class meyersSingleton
{
public:
  static T& instance()
  {
    static T theSingleton;
    return theSingleton;
  }

  meyersSingleton() = delete;
  ~meyersSingleton() = delete;
  meyersSingleton(meyersSingleton const&) = delete;
  meyersSingleton& operator=(meyersSingleton const&) = delete;

};

c++98

template<typename T>
class meyersSingleton
{
public:
  static T& instance()
  {
    static T theSingleton;
    return theSingleton;
  }

private :
  meyersSingleton();
  ~meyersSingleton();
  meyersSingleton(meyersSingleton const&);
  meyersSingleton& operator=(meyersSingleton const&);

};

このように使用できます

#include <cstdio>

template<typename T>
class meyersSingleton
{
public:
  static T& instance()
  {
    static T theSingleton;
    return theSingleton;
  }

  meyersSingleton() = delete;
  ~meyersSingleton() = delete;
  meyersSingleton(meyersSingleton const&) = delete;
  meyersSingleton& operator=(meyersSingleton const&) = delete;

};

void read_file()
{
    char buffer [100];
    fgets (buffer , 100 , meyersSingleton<FILE*>::instance());
    printf("%s", buffer);    
}

int main()
{             
    FILE **a = &meyersSingleton<FILE*>::instance();
    *a = fopen("coeff", "rb");

    read_file();   

    return 0;
}

非常に直感的な解決策ではありませんが、グローバルで単一の FILE しかないことが保証されます。

さらに単一の FILE が必要な場合は、テンプレート パラメータをもう 1 つ追加できます。

template<typename T, size_t N = 0>
class meyersSingleton
{
public:
  static T& instance()
  {
    static T theSingleton;
    return theSingleton;
  }

  meyersSingleton() = delete;
  ~meyersSingleton() = delete;
  meyersSingleton(meyersSingleton const&) = delete;
  meyersSingleton& operator=(meyersSingleton const&) = delete;

};

c を使用している場合は、このソリューションを省略してください。

編集:ほとんどの場合、シングルトンは悪い解決策、使用すべきではないアンチパターンと見なされ、そのままにしておいてください。 シングルトンの長所と短所について議論しているいくつかの良い記事があります.

なぜシングルトンはそんなに悪い シングルトン私はあなたを愛していますが、あなたは私を失望させています

誤解しないでください。シングルトンは 1 つの問題を解決します。一度に 1 つのオブジェクト (変数、リソースなど) しか持たないことを保証します。どこにでもログが必要ですが、ログはプログラムに何かを書き込みません。

于 2013-04-22T16:18:33.503 に答える