如何引用Constant但能够更改引用指向的内容?

时间:2013-11-21 18:26:53

标签: c++ visual-studio-2012

我有很多C#代码,我必须用C ++编写。我在C ++方面没有太多经验。

我正在使用 Visual Studio 2012 进行构建。该项目是 C ++中的静态库(不在C ++ / CLI中)。

我有一个包含一些静态实例的类,我希望其他类使用。我不希望任何人能够自己更改实例,但我希望其他类能够不明显地使用不同的实例。

在C ++中实现此目的的正确方法是什么?我可以使用参考文献(&)吗?我必须使用指针吗?如果我使用指针,我是否必须用" new"?分配我的课程?或者我可以使用自动分配吗?

如果我想要的不清楚,这段代码理论上会有我想要的东西,但它没有构建:

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.
}

2 个答案:

答案 0 :(得分:4)

  

我必须使用指针吗?

  

我不希望任何人能够自己更改实例

所以你想要一个指向const的指针,以防止修改指针的目标对象。

  

我必须用“新”分配我的课程吗?

不,指针可以指向任何合适类型的对象。

  

或者我可以使用自动分配吗?

当然:

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

答案 1 :(得分:2)

是的,你必须使用指针。不,您不需要动态分配,甚至不需要自动分配。使用静态分配的当前对象也具有地址,您可以使用& address-of运算符。

const MyClass* myInstance;

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

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