Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 保留引用而不是指针?_C++ - Fatal编程技术网

C++ 保留引用而不是指针?

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

我有一个类,基本上是一个文本管理器。它可以画文本等等。我基本上希望颜色和文本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中

我用指针会更好吗?
谢谢

此代码未编译。这个->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)
{
}