2010-11-16 4 views
0

Я портирую код с C# на C++. Я не уверен, как создать класс, как статический класс в C#.C# to C++ static class

// 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. Как я могу инициализировать смещение int в C++, если я сохраню его как статический, потому что он используется функцией static calculateTempearture?
  3. Должен ли я держать con accessor как статический в C++, поскольку мне нужно установить контекст?

или, в общем, каков способ реализации такого класса утилиты, как на C++?

ответ

3
  1. версия C++ вполне может быть классом, содержащим только статических членам
  2. offset переменного существа интегрального типа, он может быть инициализирован точно так же, как и в C#, если объявлено статический (но вы можете добавить const)
  3. Если context статичен, аксессор необходимо также быть статичным, как статические функции-членов не могут получить доступ к не-статическим переменным-членам

Обратите внимание, что я делаю не думаю, что это хороший дизайн. С моей точки зрения, нет смысла в «целых статических классах» в C++, и я предпочел бы использовать набор бесплатных функций в изолированном пространстве имен. Если вы все равно выбираете подход «статический класс», я бы рекомендовал объявить конструктор по умолчанию закрытым, чтобы он дал понять, что класс не указывает на то, что он создается.

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