【问题标题】:Create a class function with call-by-reference return value in C++在 C++ 中创建具有引用调用返回值的类函数
【发布时间】:2014-10-25 11:53:27
【问题描述】:

对于我的一个 cpp 程序,我创建了一些类(像往常一样,私有部分中的变量,以及公共部分中用于访问的函数)。但是现在我有一个问题,我想通过引用访问这个类中的几个变量,例如如果我通过getVariable(void) 获得它们,我想直接修改它们。我已经写了第二个函数setVariable(value)。但是这个函数只有在我只想写入变量时才可用。
如何解决在公共类函数返回的私有变量中可以读写的问题?
我已经阅读了这些问题:Passing class member function return value by reference in C++Return a reference by a class function and return a whole object in c++?,但它们不适合我的问题。

例子:

class A  
{
    private:
        int x;
    public:
        int getX(void);
        void setX(int y);
}

int A::getX(void)
{
    return A::x;
}

void A::setX(int y)
{
    A::x = y;
}

我想这样称呼它

A testA;
testA.setX(2);
testA.getX() = 5; // Ok, seems a bit strange, but some of my other functions require that...
//A::x is now 5
std::cout << testA.getX();//Output is 5

这可能吗?还是我应该重写其他函数?

【问题讨论】:

    标签: c++ class


    【解决方案1】:

    您需要一个通过引用返回私有成员的函数才能对其进行修改,例如:

    #include <iostream>
    class A
    {
        private:
            int a;
        public:
            A(): a(2) {}
            int & mutableA() { return a;}
            void printA() { std::cout << this->a << std::endl; }
    };
    
    
    
    int main()
    {
        A instance;
        instance.printA();
        instance.mutableA() += 2;
        instance.printA();
    }
    

    如果你运行这个程序,输出将是:

    2
    4
    

    在上面的示例中,我们使用函数mutableA() 修改成员a(初始值为2,之后为4)。关键元素是函数中的int &amp; return 声明,它告诉编译器,该函数将返回引用,这允许我们修改原始的私有变量。

    作为旁注,我想说这不是很常见的做法 - 当然有理由这样做,但可能是您不希望 a 首先是私有的如果您打算从课堂外修改它。这显然取决于您的设计,但值得考虑。

    【讨论】:

    • 我的一些进一步的函数需要&amp;x 作为参数,我不想改变它们(会导致程序的完全重组)。
    • 好吧,那么这应该可以解决您的问题。我还为将来在谷歌搜索您的问题时可能会阅读此答案的所有人提供了旁注。
    【解决方案2】:

    您可以返回一个可用于修改的参考:

    thing & get_member() {return member;}
    

    您还需要const 重载,因此您仍然可以从const 对象中获取它,但不能更改它:

    thing const & get_member() const {return member;}
    

    但如果你想不受限制地读写它,为什么它首先是私有的?

    【讨论】:

    • 因为我只想通过这个函数访问它,没有别的。
    • @arc_lupus:好的,但是通过引用公开它并没有直接公开它的优势。您所做的只是使代码稍大一些,并且使用起来更烦人。
    • 是的,我知道,但是目前我不想把所有的代码都一遍一遍地重写,所以我是一步一步来的……
    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多