如何在没有显式方法声明的情况下返回值?

时间:2016-05-31 16:11:00

标签: c++

在没有方法的情况下调用它时,类是否可以返回值?

例如:

class myClass{
    private:
        int iVal;

    public:
        setVal(const int i){ iVal = i; }
} 

myClass m;
m.setVal(3);

cout << m << endl;

// In this case, m would return 3;

我显然遗漏了很多东西,但这种操作是否可行?

2 个答案:

答案 0 :(得分:3)

  

在没有方法的情况下调用它时,类是否可以返回值?

我怀疑我们必须将您的问题读作“,以便在没有明确的 getter 方法声明的情况下调用它时返回一个值?”

是的,您可以提供重载的强制转换操作符:

class myClass{
    private:
        int iVal;

    public:
        void setVal(const int i){ iVal = i; }
     // vvvvvvvvvvvvvv
        operator int() const {
             return iVal;
        }
};

请见Live Demo

还修复了一些其他小错误。

这允许您在任何上下文中使用myClass,因为它只是int值:

int main()
{
    myClass m;
    m.setVal(3);

    int x = m + 5; // <<<<<<<<<<<<<<<<<<<<

    std::cout << x << std::endl; // outputs 8
}

Live Demo

std::ostream& operator<<(std::ostream&, T)实现将使用此重载自动推断myClass的{​​{1}}强制转换重载。

至于your comment

  

我认为描述我的意思的最好方法是类似于其他类处理这个。例如,可以在没有方法的情况下打印字符串,因此我想知道如何实现它。

这应该是这样的:

int

在这种情况下需要显式调用强制转换运算符,如下所示:

class myClass{
    private:
        int iVal;
        double dVal;    
    public:
        void setVal(const int i){ iVal = i; }
        void setVal(const double d){ dVal = d; }
        operator std::string () const {
             std::ostringstream oss;
             oss << "myClass { iVal = " << iVal 
                 << ", dVal = " << dVal  
                 << " }";
             return oss.str();
        }
};

Another Live Demo

当然会重载int main() { myClass m; m.setVal(3); m.setVal(3.14); std::cout << (std::string)m << std::endl; // ^^^^^^^^^^^^^ } 运算符,如other answer中所述。

答案 1 :(得分:2)

首先你不想返回一个值,你想给std :: ostream写一个值,其中cout是一个通常链接到你的控制台的实例。

#include <iostream>

class myClass{
    private:
        int iVal;

    public:
        void setVal(const int i){ iVal = i; }
        int getVal() const { return iVal; }
};

std::ostream& operator<< ( std::ostream& in, const myClass& c)
{
    in << c.getVal();
    return in;
}

int main()
{

    myClass m;
    m.setVal(3);

    std::cout << m << std::endl;
}

但要记住一些要点:

首先,operator不是此类成员。如果它不是类成员,则无法访问私有成员。为此,您可以使operator成为该类的朋友或准备一个getter方法,如示例所示。

如果您需要friend变体,请按以下方式使用:

...
public:
void setVal(const int i){ iVal = i; }
friend std::ostream& operator<< ( std::ostream& in, const myClass& c);
...

std::ostream& operator<< ( std::ostream& in, const myClass& c)
{
    in << c.iVal;
    return in;
}