重载运算符:使用C ++文字时的操作数顺序

时间:2017-06-14 19:56:45

标签: c++ operator-overloading literals operand

我正在编写一个类,我已经完成了可以混合我的类类型对象和C ++文字的操作,但仅限于一个方向。

这是一个简化的代码,显示了这个想法:

for ($i = 1; $i < count($csvarray); $i++) {
    array_multisort(array_column($csvarray, $i), SORT_DESC,
                    $csvarray, SORT_DESC);


    echo "<pre>";
    print_r($csvarray);
    echo "</pre>"; 

} 

如你所见,我可以做类似的事情:

#include <iostream>
#include <string>
using namespace std;

class CLS
{
    string str;

public:
    CLS(const char* param)
    {    str = param;   }

    CLS operator+(const CLS& rhs)
    {
        str = str + rhs.str;
        return *this; }

    friend ostream& operator<<(ostream& out, const CLS& rhs);
};

ostream& operator<<(ostream& out, const CLS& rhs)
{
    out << rhs.str;
    return out; }

int main()
{
    CLS a("\n Hello ");
    CLS b("bye!\n\n");

    cout << a + "World!\n\n";

    //cout << "\n Good " + b; /* this is not possible because of the operands order */
}

但不是,

a + "W";

如代码的最后一行所示。

我理解原因。

第一个相当于:

"W" + a;

这是我班上的。然而,第二个是,

a.operator+("W");

没有被覆盖,文字本身不是我理解的类的对象。因此,整体表达不可能。

我知道我可以创建用户定义的文字,但这不是我想要做的。 (虽然我不确定他们是否会工作)。

我找不到任何我想在这个网站上有关的提示浏览问题,我无法在网上找到与我的问题相关的内容。

我的问题:

有没有办法让这两种订单都有效?

2 个答案:

答案 0 :(得分:4)

此代码:

cout << "\n Good " + b; /* this is not possible because of the operands order */

不起作用,因为您创建了operator+成员(而不是const成员)。如果你把它重写为独立函数(可能是朋友),那么这个问题就会消失:

friend 
CLS operator+(const CLS& lhs, const CLS& rhs)
{
    CLS r;
    r.str = lhs.str + rhs.str;
    return r; 
}

如果你创建了接受const std::string &的额外ctor,它会更简单:

friend 
CLS operator+(const CLS& lhs, const CLS& rhs)
{
    return CLS( lhs.str + rhs.str );
}

请注意,您应该以这种方式重写现有的构造函数:

CLS(const char* param) : str( param )
{}

它更清洁,更有效

答案 1 :(得分:2)

您可以添加全局功能:

$objPHPPowerPoint->getLayout()->setDocumentLayout(['cx' => 1280, 'cy' => 700], true)
        ->setCX(1280, DocumentLayout::UNIT_PIXEL)
        ->setCY(700, DocumentLayout::UNIT_PIXEL);`