4

単一の静的メンバーを宣言する C++ クラスがあります。クラス全体がヘッダー ファイルに含まれているため、静的メンバー定義を含めるためだけに .cpp ファイルを作成するのは避けたいと思います。私は static キーワード (C の意味で) と匿名の名前空間を使用しようとしましたが、どちらもヘッダー ファイルの静的リンケージ (asfaik) で宣言された変数を与える必要がありますが、どちらのアプローチも機能しません。問題?

struct ServiceType {} ;
struct Transport
{
    static ServiceType service ;
};

//error: definition of ‘Transport::service’ is not in namespace enclosing ‘Transport’
//namespace { ServiceType Transport::service ; }

//error: ‘static’ may not be used when defining a static data member
//static ServiceType Transport::service ;
4

4 に答える 4

6

ファイルを作成する必要がないようにすることが目標である場合、.cpp最も簡単な解決策は、静的データ メンバーをインライン静的メンバー関数でラップすることです。つまり、次のようなものです。

struct Transport
{
    static ServiceType& service()
    {
        static ServiceType theData;
        return theData;
    }
};

もちろん、アクセスするにservice()は、 だけでなく、構文を使用する必要があります。service

于 2013-03-07T14:00:43.420 に答える
2

内部リンケージを持つ静的メンバーを定義することはできません。

ヘッダー ファイルで静的メンバーを定義するserviceと、このヘッダー ファイルをインクルードするすべてのソースにインスタンスが作成されます。これが問題にならない場合は、匿名の名前空間を全体にラップできます。struct Transport

namespace {
struct Transport
{
    static ServiceType service ;
};

ServiceType Transport::service;
}
于 2013-03-07T13:13:22.810 に答える
0

匿名の名前空間は、コンパイル ユニット全体で表示されます。複数のソース ファイルにヘッダーを含めると、Transport::service という名前の複数のシンボルが作成されます。symbol already definedリンカーからエラーが発生するため、これは機能しません。

service残念ながら、C++ の動作では、ファイル内のシンボルの定義を移動せずにこれを回避することはできません.cpp

したがって、.cppファイル内で行うか、名前空間の一部にTransport::ServiceType service;なりたくない場合は、ヘッダーと.serviceextern ServiceType service;ServiceType service;.cpp

于 2013-03-07T13:12:36.997 に答える
0

試す

ServiceType Transport::service ;

これは間違っています:

namespace { ServiceType Transport::service ; } //You are adding it in an unnamed namespace, rather than whatever namespace Transport is actually in - presumably the global namespace

これは間違っています:

static ServiceType Transport::service ; // You dont need the static here, only in the struct.

ただし、ヘッダーに含めることを主張すると、リンカーエラーが発生することが予想されます

于 2013-03-07T13:15:23.340 に答える