簡體   English   中英

C#到C ++靜態類

[英]C# to C++ static class

我正在將一些代碼從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();
}

基本上,temperatureClass是一個實用程序類,用於執行不會創建任何實例的計算。 我有幾個問題:

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

或更籠統地說,像C ++中那樣實現實用工具類的方式是什么?

  1. C ++版本很可能是僅包含靜態成員的類
  2. offset變量是整數類型,如果聲明為static,則可以使用與C#中相同的方式進行初始化(但您可能要添加const
  3. 如果context是靜態的,則訪問器也必須是靜態的,因為靜態成員函數無法訪問非靜態成員變量

請注意,我認為這不是好的設計。 從我的角度來看,C ++中的“全靜態類”沒有太多意義,我寧願在隔離的名稱空間中使用set free函數。 無論如何,如果您選擇“靜態類”方法,建議您將默認構造函數聲明為私有,以明確表明該類沒有實例化。

在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);
}

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

  1. C ++中沒有顯式的靜態類,但是您可以通過將構造函數隱藏為私有的並提供公共靜態方法來在C ++中實現相同的目的。

  2. 通過靜態初始化:

    class temperatureClass {private:static int offset; };

    int temperatureClass :: offset = 50;

  3. 您可以使其保持靜態,因此將盡可能地遵循原始格式。

一些空中代碼,但不允許它通過編譯器(因此,如果發生錯誤,請告訴我,我會修復它,但是我認為大多數內容都應該已經從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 ++)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM