我有以下课程:
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
,对吧?
答案 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。如果要将其存储在非常量指针中,则需要将其更改为常规引用。