2010-11-16 78 views
0

我將一些代碼從C#移植到C++。我不知道如何在C#中創建類似靜態類的類。C#到C++靜態類

// in C# 
public static temperatureClass{ 
    private static int offset = 50; 
    private static Context context; 

    public static calculateTemperature(){ 
    //use a; 
    //use context; 
    } 

    public static Context con{ 
    set{ 
     context = value; 
     } 
    } 
} 

int main() { 
Context con1; 
temperatureClass.con = con1; //con1 is a 
temperatureClass.calculateTemperature(); 
} 

基本上溫度類是一個工具類來執行計算,不會創建任何實例。 我有幾個問題:

  1. 如果C++版本的calculateTemperature保持靜態?
  2. 如何將C++中的int偏移量初始化爲靜態,因爲靜態calculateTempearture函數使用它?
  3. 我應該如何保持con訪問器在C++中是靜態的,因爲我需要設置上下文?

或者更一般地說,在C++中實現一個工具類的方式是什麼?

回答

3
  1. C++版本很可能是隻包含靜態成員類
  2. offset變量被整體式的,它可以在C#初始化相同的方式,如果聲明爲static(但你可能要添加一const
  3. 如果context是靜態的,存取必須也是靜態的靜態成員函數不能訪問非靜態成員變量

注意,我做不認爲這是很好的設計。從我的觀點來看,C++中的「整個靜態類」中沒有多少意義,我寧願在一個孤立的名稱空間中使用一組自由函數。如果你選擇了「靜態類」方法,我建議聲明默認構造函數爲private,以清楚說明該類沒有指向被實例化。

0

C#中的靜態類只是無法實例化的類,只包含靜態方法。

  1. 有在C++中沒有明確的靜態類,但你完全可以通過隱藏構造爲私有,並提供公共靜態方法實現在C++中一樣。

  2. 通過靜態初始化:

    類temperatureClass { 私人: 靜態INT抵消; };

    int temperatureClass :: offset = 50;

  3. 您可以將其保留爲靜態,因此您將盡可能地遵循原始內容。

0

一些空氣代碼,不讓它經過編譯器(所以如果有錯誤,請告訴我,我會修復它,但我認爲大部分的東西應該被翻譯正確直白從C#來C++)。

class temperatureClass 
{ 
    private: 
     static int offset = 50; 
     static Context context; 
     temperatureClass(){}; // avoid instantiation 

    public: 
    static void calculateTemperature() 
    { 
     //use a; 
     //use context; 
    } 

    static void SetCon(Context c) 
    { 
     context = c; 
    } 
}; // dont forget semicolon in C++ :-) 

int main() 
{ 
    Context con1; 
    temperatureClass::SetCon(con1); 
    temperatureClass::calculateTemperature(); 
} 

(如果這是一個好的設計,那是另一問題,但那是獨立的C#或C++)

2

在C++中,你不需要靜態類,因爲你可以在命名空間範圍內具有功能。在C#中,需要靜態類,因爲所有函數都必須位於類範圍內。

我會做這樣的事情:


// temp.h 
namespace temperature { 
    void calculateTemperature(const Context& context); 
} 

// temp.cpp 
namespace { // private stuff 
    int offset = 50; 
} 

namespace temperature { 
    void calculateTemperature(Context context){ 
    //use a; 
    //use context; 
    } 
} 

// programm.cpp 
#include "temp.h" 

int main() { 
Context con1; 
temperature.calculateTemperature(con1); 
}