Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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++ 如何编写getter方法以使其返回右值_C++_Visual Studio 2010 - Fatal编程技术网

C++ 如何编写getter方法以使其返回右值

C++ 如何编写getter方法以使其返回右值,c++,visual-studio-2010,C++,Visual Studio 2010,如果我们有这个类定义 class BusDetails { private: string m_busName; public: string BusName() const { return m_busName; } }; 如何更改或使用getter方法,以便将返回值用作左值会导致编译器错误 例如,如果我像这样使用它 int main(void) { BusDetails bus; bus.BusName() = "abc"; // <--- T

如果我们有这个类定义

class BusDetails
{
private:
    string m_busName;
public:
    string BusName() const { return m_busName; }
};
如何更改或使用getter方法,以便将返回值用作左值会导致编译器错误

例如,如果我像这样使用它

int main(void)
{
    BusDetails bus;

    bus.BusName() = "abc";    // <--- This should give a compiler error
    cout << bus.BusName() << endl;

    return 0;
}
int main(无效)
{
公共汽车;
bus.BusName()=“abc”//已将
BusName()
声明为常量函数。因此它无法更改成员。 函数应该返回
字符串&
,而不是常量

string& BusName() { return m_busName; }
此外,您还可以为常量对象添加(
为常量):

BusName()
已声明为常量函数。因此它无法更改成员。 函数应该返回
字符串&
,而不是常量

string& BusName() { return m_busName; }
此外,您还可以为常量对象添加(
为常量):


嗯,这是一种你所写的预期行为

您确实返回了
m_busName
的一个副本。因为您不返回引用。因此,将创建一个返回变量的临时副本,然后进行赋值。
操作符=
在该副本上调用了
“abc”

因此,方法应该是
string&BusName()const{return m_BusName;}
,但这将导致编译器错误

你想要的东西有点矛盾。你说
string BusName()const
,但你想返回一个允许改变对象状态的引用

但是,如果您不保证对象不会更改,则可以删除
常量
,然后继续

string& BusName() { return m_busName; };
或者如果您想保持
常量

const string& BusName() const { return m_busName; };
然而,这自然会在赋值上产生错误


函数也是如此。如果您确实通过引用传递参数,那么它就是一个引用。如果您看到您修改了一个副本,那么您一定不是通过引用传递的,而是通过值传递的。

您所写的是一种预期行为

您确实返回了
m_busName
的一个副本。因为您不返回引用。因此,将创建一个返回变量的临时副本,然后进行赋值。
操作符=
在该副本上调用了
“abc”

因此,方法应该是
string&BusName()const{return m_BusName;}
,但这将导致编译器错误

你想要的东西有点矛盾。你说
string BusName()const
,但你想返回一个允许改变对象状态的引用

但是,如果您不保证对象不会更改,则可以删除
常量
,然后继续

string& BusName() { return m_busName; };
或者如果您想保持
常量

const string& BusName() const { return m_busName; };
然而,这自然会在赋值上产生错误


函数也是如此。如果您确实通过引用传递参数,那么它就是一个引用。如果您看到您修改了一个副本,那么您一定不是通过引用传递的,而是通过值传递的。

不清楚您想要什么行为

  • 如果您希望分配为错误,请保留所有 值返回的灵活性(例如,您可以将代码修改为 返回计算值),您可以返回
    std::string const
    。 (这会抑制移动语义,但通常不会 (这是一个大问题。)

  • 如果您希望能够修改“成员”,但仍希望 在如何实施方面保持灵活性 类,那么您应该提供一个setter方法 约定(不是唯一的约定)是提供getter函数 就像现在一样(但返回
    std::string const
    ),以及 提供具有相同名称的函数
    void
    BusName(std::string const&newValue)
    设置值。 (其他约定将使用类似于
    setbuname
    或return的名称 旧值,以便客户端代码可以保存和恢复它,或者 返回
    *此
    ,以便客户端代码可以链接操作:
    obj.BusName(“toto”).SomethingElse(/*…*/)

  • 您还可以提供返回引用的非常量成员 但是,如果你这样做的话,你还不如 数据成员是公共的

  • 最后,您可以提供一个返回 某种代理类,这样分配给它实际上 调用setter函数,并将其转换为
    std::string
    打电话给getter。这是迄今为止最灵活的,如果你愿意的话 希望支持客户端的修改,但也需要 目前为止,它是最复杂的,因此您可能不想使用它,除非您 需要


    • 不清楚你想要什么样的行为

      • 如果您希望分配为错误,请保留所有 值返回的灵活性(例如,您可以将代码修改为 返回计算值),您可以返回
        std::string const
        。 (这会抑制移动语义,但通常不会 (这是一个大问题。)

      • 如果您希望能够修改“成员”,但仍希望 在如何实施方面保持灵活性 类,那么您应该提供一个setter方法 约定(不是唯一的约定)是提供getter函数 就像现在一样(但返回
        std::string const
        ),以及 提供具有相同名称的函数
        void
        BusName(std::string const&newValue)
        设置值。 (其他约定将使用类似于
        setbuname
        或return的名称 旧值,以便客户端代码可以保存和恢复它,或者 返回
        *此
        ,以便客户端代码可以链接操作:
        obj.BusName(“toto”).SomethingElse(/*…*/)

      • 您还可以提供返回引用的非常量成员 但是,如果你这样做的话,你还不如 数据成员是公共的

      • 最后,您可以提供一个返回 某种代理类,这样分配给它实际上 调用setter函数,并将其转换为
        std::string
        woul