У меня много кода С#, который я должен написать в C++. У меня нет большого опыта работы в C++.
Я использую Visual Studio 2012 для сборки. Проект представляет собой статическую библиотеку в C++ (не в C++/CLI).
У меня есть класс с некоторыми статическими экземплярами, которые я хочу использовать для других классов. Я не хочу, чтобы кто-либо мог изменять сами экземпляры, но я хочу, чтобы другие классы могли использовать разные экземпляры нечетко.
Каков правильный способ выполнить это в C++? Могу ли я использовать ссылки (&)? Должен ли я использовать указатели? Если я использую указатели, мне нужно назначить мой класс "новым"? или я могу использовать автоматическое распределение?
В случае, если я хочу, неясно, этот код теоретически имел бы то, что я хочу, но он не создает:
C++ MyClas.h//Это мой класс со статическими экземплярами
class MyClass
{
private:
std::string name;
public:
MyClass(void);
MyClass(string name);
MyClass(const MyClass&);
~MyClass(void);
std::string GetName(){return name;}
static const MyClass& Instance1();
static const MyClass& Instance2();
};
C++ MyClas.cpp
MyClas::MyClas(void)
{
}
MyClas::MyClas(string name)
{
this->name = name;
}
MyClas::MyClas(const Unit& unit)
{
name = unit.name;
}
MyClas::~MyClas(void)
{
}
const MyClas instance1= MyClas("Instance1");
const MyClas& MyClas::Instance1()
{
return instance1;
}
const MyClas instance2= MyClas("Instance2");
const MyClas& MyClas::Instance2()
{
return instance2;
}
Как я хотел бы использовать его (это не строится, хотя)
C++ MyOtherClass.h//Этот класс использует экземпляры MyClass
class MyOtherClass
{
protected:
const MyClass& myInstance;
public:
MyOtherClass(void);
~MyOtherClass(void);
void Swap(const MyClass& myInstance);
};
C++ MyOtherClass.cpp
MyOtherClass::MyOtherClass(void): myInstance(MyClass::Instance1())
{
}
MyOtherClass::~MyOtherClass(void)
{
}
void MyOtherClass::Swap(const MyClass& instance)
{
myInstance = instance; //Here it fails because I want to modify a const.
//I want to change my code so I only have 1 instance
//Instance1 and 1 Instance2 of MyClass, buy MyOtherClass
//can reference either without modifying them.
}
Должен ли я использовать указатели?
Да.
Я не хочу, чтобы кто-либо мог изменять сами экземпляры
Поэтому вам нужен указатель на const
, чтобы предотвратить изменение целевого объекта указателя.
мне нужно выделить мой класс "новым"?
Нет, указатели могут указывать на любой объект подходящего типа.
или я могу использовать автоматическое распределение?
Конечно:
thing t1, t2;
thing const * p = &t1; // points to t1
p = &t2; // points to t2
Да, вы должны использовать указатели. Нет, вам не нужно динамическое распределение или даже автоматическое распределение. В ваших текущих объектах, использующих статическое распределение, также есть адреса, которые вы используете с помощью оператора &
address-of.
const MyClass* myInstance;
MyOtherClass::MyOtherClass(void): myInstance(&MyClass::Instance1())
void MyOtherClass::Swap(const MyClass& instance)
{
myInstance = &instance;
}
Swap
следует избегать.std::swap
в C ++ означает получение двух объектов одного типа и обмен их внутренним состоянием. Метод под названиемSwap
, у которого нет этого значения, просто запутает вещи.