「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ で静的フィールドを設定すると「未解決の外部シンボル」エラーが発生するのはなぜですか?

C++ で静的フィールドを設定すると「未解決の外部シンボル」エラーが発生するのはなぜですか?

2024 年 11 月 9 日に公開
ブラウズ:895

Why Am I Getting \

静的オブジェクト フィールドの未解決の外部シンボル

この記事では、設定しようとしたときに発生するエラー メッセージ「エラー LNK2001: 未解決の外部シンボル」について調査します。メイン メソッドからのクラスの静的フィールド。

提供されたコード スニペットでは、クラス "B" の静的フィールド "a" の宣言がクラス定義自体の中で発生します。ただし、C 標準によれば、そのような宣言は定義とみなされません。静的データ メンバーの場合、適切な定義は、「::」演算子を使用して、それを囲む名前空間スコープ内のクラスの外側に現れる必要があります。

この要件を管理するルールは、One Definition Rule (ODR) として知られています。これにより、すべてのエンティティ (静的データ メンバーを含む) がプログラム全体で単一の一意の定義を持つことが義務付けられます。このルールにより、静的メンバーの値に関してあいまいさが存在しないことが保証されます。

したがって、エラーを解決するには、コードを次のように変更する必要があります。ここで、「a」は名前空間スコープで定義されています。

class A
{
public:
    A()
    {

    }
};

class B
{
public:
    static A* a;
};

A* B::a; // Definition in namespace scope

int main()
{
    B::a = new A;
}

クラスの外で静的メンバーを明示的に定義することにより、リンカーはシンボル参照を正しく解決でき、コードは正常にコンパイルされます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3