如何将函数中返回的对象用作另一个函数的参数C ++

时间:2016-02-07 12:51:29

标签: c++ function object parameters

我的工作是创建一系列对象,并为他编写三个操作符函数,这些函数与他进行不同的操作。我不知道如何将数组作为每个函数的参数传递。当我调用第二个运算符函数friend void operator+(A &x);时,它再次调用构造函数,但我想使用第一个函数的结果。

class A{
    string name;
    double array[N];
    int group;
public:
    A();
    ~A();
    friend A operator--(A x);
    friend void operator+(A &x);
    friend A operator&(A x);
};
A operator--(A x){
    A z;
    // some code
    return z;
}
void operator+(A &x){
    //here I must use the returned object z;
}
A operator&(A x){
    //here I must use the returned object z;
}
void main() {
    A *a;
    a = new А[2];
    for (int i = 0; i < N; i++){
        (--a[i]);
        +(a[i]);
    }
}

3 个答案:

答案 0 :(得分:1)

如果创建的每个对象没有被另一个对象添加或减去,那么这应该有效。你在main()中的原始代码不能用clang编译,所以我修改它以使用向量。

#include <iostream>
#include <string>
#include <vector>

constexpr int N = 2;

class A
{
private:
    std::string name;
    double array[N];
    int group;
public:
    A() {};
    A(std::string s, int g) : name(s), group(g) {};
    ~A() {};
    int getGroup() { return group; }
    friend void operator--(A&);
    friend void operator+(A&);
};

void operator--(A& a) {
    --a.group;
    std::cout << "overloaded operator --" << std::endl;
}

void operator+(A& a) {
    a.group += 3;
    std::cout << "overloaded operator +" << std::endl;
}

using namespace std;

int main(int argc, char const *argv[])
{
    std::vector<A> v;
    for (int i = 0; i < N; ++i) {
        v.emplace_back(A{});
    }
    v.emplace_back(A{"my name", 5});

    for (auto& i : v) {
        --(i);
        cout << "group: " << i.getGroup() << endl;
        --(i);
        cout << "group: " << i.getGroup() << endl;
        +(i);
        cout << "group: " << i.getGroup() << endl;
    }
    return 0;
}

输出:

overloaded operator --
group: -1
overloaded operator --
group: -2
overloaded operator +
group: 1
overloaded operator --
group: -1
overloaded operator --
group: -2
overloaded operator +
group: 1
overloaded operator --
group: 4
overloaded operator --
group: 3
overloaded operator +
group: 6

如果您需要名称和组中的特定值,则可以在vector<std::pair>或类似的a中填充a中的值,然后迭代该向量和emplace_back(A {p.first,p.second})。并添加一个接受这些值的构造函数。

答案 1 :(得分:0)

您应该通过引用传递数组 - 这意味着通过地址而不是值。

此处再次调用构造函数,因为您的对象被复制(然后重建)而不是仅作为参数传输。

答案 2 :(得分:0)

使用第一个第三个​​运算符中的引用传递。就像你在第二个中那样。