非const引用类成员

时间:2012-08-19 19:16:11

标签: c++ pointers reference

我有以下课程:

class BaseStyle {
    private:
        Style *style;
    public:
        BaseStyle(Style& theStyle);
        const Style& getStyle() const;
        void setStyle(const Style& theStyle);
};

我正在尝试在style中存储构造函数中传递的引用,并在调用setStyle()时更改该属性。我希望能够拥有一个属性Style& style,然后我初始化后无法更改read c ++引用属性。现在我认为最好将引用存储在指针中,但我该怎么做?我不能只做style = theStyle,对吧?

4 个答案:

答案 0 :(得分:1)

你应该像这样实现你的类:

class BaseStyle
{
    private:
        Style *style;
    public:
        BaseStyle(Style &theStyle) { style = &theStyle; }
        const Style &getStyle() const { return(*style); }
        void setStyle(Style &theStyle) { style = &theStyle; }
};

说明:引用实现为指针。这在文档中没有明确说明,因为没有编译器做任何与此不同的事情。差异只是语法上的。这意味着,通过编写&theStyle,您可以获取可以分配给指针的对象的地址。

获取对象的地址没有什么不好,由引用引用并将其分配给指针。

答案 1 :(得分:0)

如果您想使用指针,请将您的类代码更改为:

class BaseStyle {
    private:
        Style *style;
    public:
        BaseStyle(Style* theStyle);
        Style* getStyle();
        void setStyle(Style* theStyle);
};

然后设置样式,执行此操作:

首先,为要传递到Style的{​​{1}}对象创建一个指针:

setStyle

然后将Style* myStyle = new Style(); 对象传递到myStyle函数:

setStyle

或者如果baseStyleObj.setStyle(myStyle); 也是指针:

baseStyleObj

将变量命名为与其类相同也是不好的做法;您的班级成员baseStyleObj->setStyle(myStyle); 应该被命名为Style*以外的其他人。 style是您可以使用的一种约定(m_style表示它是成员变量),但还有许多其他约定。当然,这不会影响代码的编译;这只是一种很好的做法。

答案 2 :(得分:0)

传递对象的引用并存储指向对象的指针没有错:

class BaseStyle {
    private:
        Style *style;
    public:
        BaseStyle(Style& theStyle)              :style(&theStyle) {}
        const Style& getStyle() const           {return *style;}
        void setStyle(/*const*/ Style& theStyle){style = &style);}

                 //   ^^^^^^^^^ Your problems are caused becasue you passeded
                 //             a const reference but are storing the value in a non const
                 //             pointer. Just remove this const and it will compile.
};

您的类的用户只需要知道对象保持对传递的对象的内部引用(而不是C ++引用),因此它的生命周期必须与对象一样长。这是暗示的,因为你有一个通过引用获取值的set方法。

如果您对直接使用指针感到不舒服,可以使用boost :: ref对象。

class BaseStyle {
    private:
        boost::reference_wrapper<Style> style;
    public:
        BaseStyle(Style& theStyle)              :style(theStyle) {}
        const Style& getStyle() const           {return style;}
        void setStyle(/*const*/ Style& theStyle){style = boost::ref(style));}
};

这基本上是可以重新安置的参考。在内部注意它使用指针但在外部它的行为类似于引用。

答案 3 :(得分:-1)

您可以通过执行

将引用存储在指针中
style = &theStyle;

然而这是不好的做法。如果您要将其存储在指针中,则应该明确地接收指针(并记录所有权语义)。

此外,setStyle目前正在接受const ref。如果要将其存储在非常量指针中,则需要将其更改为常规引用。