我有一个基本上是文本管理器的类。它可以绘制文字和诸如此类的东西。我基本上希望颜色和文本std :: string只是一个常量引用。那么
是否可以class TextManager {
const std::string &text;
void draw(const std::string &text) const;
public:
TextManager(const std::string &text)
{
this->text = text;
}
void someMethod()
{
draw(text);
}
};
我希望当拥有TextManager文本实例的类发生更改时,更改会反映在TextManager中。
我会更好地使用指针吗? 感谢
答案 0 :(得分:5)
如果你永远不需要重新安置参考(即参考不同的物体),那就没关系了。但根据我的经验,你将不可避免地发现你需要更灵活的线,在这种情况下,参考是一种痛苦。从一开始就使用指针可能更好。
但请注意,您只能在构造函数初始化列表中初始化引用类型的成员变量。 (另外,您可能希望将构造函数声明为explicit
)。
答案 1 :(得分:4)
此代码无法编译。 this->text = text
没有做你认为它做的事情 - 它不像Java那样分配引用就像改变指针一样。 reference = value
实际上会调用复制操作符,因此它会将rhs的值复制到lhs,作为逐个成员的副本,或者如果被覆盖则使用operator=
。由于你的text
是常量,你不能这样做。
所以在这种情况下,你必须使用一个指针 - 初始化后不能修改引用。
编辑:只是为了解释 可以使用引用的方式:
const std::string &text = yourString;
或:
TextManager(const std::string &textRef)
: text(textRef)
{
}
这样,你就可以永久引用你拥有的任何字符串。
答案 2 :(得分:1)
一旦你完成了初始化(其他评论可以帮助你),使用参考将让你做你想要的。也就是说,对引用的std :: string的更改将影响您的类,因为它们是相同的std :: string。
使用std :: string const *而不是std :: string const&可以获得类似的行为。正如Oli所说,使用指针更灵活。由于指针可以为null并且可以使用指针进行更新,因此您可以定义默认构造函数和(可能是编译器生成的)赋值运算符。这可能在这个类中不重要,但可能会出现在你要编写的其他类中(例如,如果你想把这个类的对象放到std :: vector中)。所以你最好在内部使用指针。虽然您可能仍希望传递对构造函数的引用并获取它的地址以初始化该成员。