2017-04-06 8 views
4

私は現在のプロジェクトのユーティリティ関数を書いています。クラスの多重定義

今、私は静的メソッドを持つクラスを定義utility.hヘッダを有する:

#pragma once 

class Utils 
{ 
public: 
    static int firstFunc() 
    { 
     return 0; 
    } 

    static bool secondFunc() 
    { 
     return false; 
    } 
}; 

このヘッダは、私が2つの変換単位に(このような機能を使用する必要があるたびに含まれています瞬間)それはうまく動作します。

コードレビューの後、このクラスをCスタイルの関数に置き換えることを提案しました。私の素朴な最初の試み:

#pragma once 

int firstFunc() 
{ 
    return 0; 
} 

bool secondFunc() 
{ 
    return false; 
} 

が機能エラーの複数の定義を返し、リンクに失敗しました。 私はこれがなぜ起こるのか理解しています。関数定義を含むutils.hというヘッダーは、2つの異なるコンパイル単位に存在します。リンカーは、使用する定義がわかりません。

解決策は、定義を専用のutils.cppに移動し、ヘッダーに宣言だけを残すことです。

私の質問は今です:異なるクラスの翻訳単位で同じクラスの複数の定義がまだあったときに、静的メソッドを持つクラスを作成したときに、なぜこのようなことが起こりませんでしたか?

+0

私はあなたにはC++を学ぶJavaプログラマーですか? (申し訳ありませんがあなたを怒らせる場合)これはJava技術で、クラスを悪用して名前のスコープを提供します。 C++では 'namespace'を使ってこれを行います。 –

答えて

2

クラス本体の内部に直接書き込まれる関数定義(静的かどうか)は暗黙的にinlineです。定義を区切らなければならなかった:

#pragma once 

class Utils 
{ 
public: 
    static int firstFunc(); 

    static bool secondFunc(); 
}; 

static int Utils::firstFunc() 
{ 
    return 0; 
} 

static bool Utils::secondFunc() 
{ 
    return false; 
} 

...あなたはまったく同じ多重定義エラーを目撃したでしょう。

また、これらは「Cスタイルの関数」ではなく、単に(メンバーではない)関数ではありません。 C++には無料の関数とは何も関係ありません;)

+0

ありがとう、私はそれを知らなかった。あなたが何かをリンクする必要がない場合、リンカーは不平を言うことはできません;) –

関連する問題