3

我有以下课程:

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

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

4

4 回答 4

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您可以获取可以分配给指针的对象的地址。

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

于 2012-08-19T20:02:21.803 回答
0

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

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

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

Style首先,为要传递的对象创建一个指针setStyle

Style* myStyle = new Style();

然后将您的myStyle对象传递给setStyle函数:

baseStyleObj.setStyle(myStyle);

或者 ifbaseStyleObj也是一个指针:

baseStyleObj->setStyle(myStyle);

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

于 2012-08-19T19:26:51.577 回答
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));}
};

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

于 2012-08-19T23:32:27.007 回答
-1

您可以通过执行将引用存储在指针中

style = &theStyle;

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

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

于 2012-08-19T19:19:41.987 回答