C++ 保留引用而不是指针?
我有一个类,基本上是一个文本管理器。它可以画文本等等。我基本上希望颜色和文本std::string只能是一个常量引用。这样做可以吗C++ 保留引用而不是指针?,c++,C++,我有一个类,基本上是一个文本管理器。它可以画文本等等。我基本上希望颜色和文本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 someMe
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中
我用指针会更好吗?
谢谢此代码未编译。这个->text=text并不像你想象的那样-它不像Java那样分配引用就像改变指针。reference=value将实际调用copy操作符,因此它将把rhs的值复制到lhs,或者作为成员对成员的copy,或者如果它被重写,则使用操作符=。因为你的文本是常量,你不能这样做 因此,在这种情况下,必须使用指针-一旦初始化,就无法修改引用 编辑:仅解释您可以使用引用的方式: const std::string&text=yourString 或:
这样,您就有了对任何字符串的永久引用。如果您永远不需要重新定位引用,即引用不同的对象,那么就可以了。但根据我的经验,你以后不可避免地会发现,你需要更加灵活,在这种情况下,引用是一种痛苦。最好从一开始就使用指针
但请注意,您只能在构造函数初始化器列表中初始化引用类型的成员变量。此外,您可能希望将该构造函数声明为显式的。一旦您整理出其他注释可以帮助您的初始化,使用引用将允许您执行您想要的操作。也就是说,对引用的std::string的更改将影响您的类,因为它们是相同的std::string
使用std::string const*而不是std::string const&,可以获得类似的行为。正如奥利所说,使用指针更灵活。由于指针可以为null,并且可以使用指针进行更新,因此允许您定义默认构造函数和可能由编译器生成的赋值运算符。这在这个类中可能不重要,但可能会在其他类中,如果您想将这个类的对象放入std::vector中,您将编写例如。因此,您最好在内部使用指针。尽管您可能仍希望传递一个对构造函数的引用,并获取其地址来初始化成员。这不会编译,对吗?我不认为您可以更改常量引用。我写这篇文章只是为了让您了解我的概念。这段代码几乎肯定不是您想要的。文本管理器masd;m、 someMethod;//乌兰巴托。您应该存储一个std::string。@GMan我不想每次父类的字符串更改时都更新该字符串though@Milo-您应该做的是存储常量,但它应该作为非常量传递到构造函数中。这将阻止GMan描述的行为。可以初始化作为类成员的引用。它必须在构造函数的初始化列表中完成。在我看来,这种初始化的例子比这个答案中提供的例子更合适。虽然关于赋值的行是正确的,但显示的代码仍然可以使用引用。只需要修改它来初始化构造函数的初始值设定项列表中的引用。
TextManager(const std::string &textRef)
: text(textRef)
{
}