2017-04-06 26 views
4

我正在編寫當前項目的實用函數。類的多重定義

現在,我有一個utility.h頭定義靜態方法的類:

#pragma once 

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

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

這頭被包含每次我需要在使用這些函數(兩種翻譯單位時間時刻),它工作得很好。

現在,在代碼審查後,有人建議用C風格的函數替換這個類。我天真的第一次嘗試:

#pragma once 

int firstFunc() 
{ 
    return 0; 
} 

bool secondFunc() 
{ 
    return false; 
} 

未鏈接,返回的功能錯誤多個定義。 我明白爲什麼會發生這種情況:包含函數定義的頭文件utils.h存在於兩個不同的編譯單元中:鏈接器不知道要使用哪個定義。

我知道解決方案是將定義移動到專用的utils.cpp並且只保留頭中的聲明。

我現在的問題是:爲什麼沒有這種情況發生時,我曾與靜態方法,當我仍然有不同的翻譯單位的同一類的多個定義的類?

+0

讓我猜測:你是一個Java程序員,學習C++? (對不起,如果這冒犯你)這是一種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

謝謝,我不知道。有意義的,如果你不需要鏈接任何東西,鏈接器不能抱怨;) –