Как получить ссылку на константу, но иметь возможность изменить то, на что указывает ссылка?

0

У меня много кода С#, который я должен написать в 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.
}
  • 0
    Название Swap следует избегать. std::swap в C ++ означает получение двух объектов одного типа и обмен их внутренним состоянием. Метод под названием Swap , у которого нет этого значения, просто запутает вещи.
  • 0
    @Yakk спасибо за подсказку, я просто добавил swap, чтобы обозначить то, что я хотел, но это фактическое имя.
Теги:
visual-studio-2012

2 ответа

4
Лучший ответ

Должен ли я использовать указатели?

Да.

Я не хочу, чтобы кто-либо мог изменять сами экземпляры

Поэтому вам нужен указатель на const, чтобы предотвратить изменение целевого объекта указателя.

мне нужно выделить мой класс "новым"?

Нет, указатели могут указывать на любой объект подходящего типа.

или я могу использовать автоматическое распределение?

Конечно:

thing t1, t2;
thing const * p = &t1;  // points to t1
p = &t2;                // points to t2
2

Да, вы должны использовать указатели. Нет, вам не нужно динамическое распределение или даже автоматическое распределение. В ваших текущих объектах, использующих статическое распределение, также есть адреса, которые вы используете с помощью оператора & address-of.

const MyClass* myInstance;

MyOtherClass::MyOtherClass(void): myInstance(&MyClass::Instance1())

void MyOtherClass::Swap(const MyClass& instance)
{
    myInstance = &instance;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню