Как реализовать функцию с одним аргументом, который меняет частный контент объектов - PullRequest
0 голосов
/ 09 октября 2019

Я создал класс, в котором хранится дерево частных выражений. Я должен добавить функцию к этому классу, которая принимает свой собственный тип в качестве аргумента и меняет деревья этих объектов. Если бы я мог использовать 2 аргумента, я полагаю, я мог бы создать функцию друга. Я был бы признателен за некоторые идеи о том, как я мог бы реализовать такую ​​функцию.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Вот демонстрационная программа, которая показывает, как можно определить подстановку функции-члена.

#include <iostream>
#include <utility>

class A
{
private:
    int x;
public:
    explicit A( int x = 0 ) : x( x ) {}

    void swap( A &a ) noexcept
    {
        int tmp = std::move( a.x );
        a.x = std::move( this->x );
        this->x = std::move( tmp );
    }

    void swap( A &&a ) noexcept
    {
        int tmp = std::move( a.x );
        a.x = std::move( this->x );
        this->x = std::move( tmp );
    }


    const int & getX() const { return x; }
};

int main() 
{
    A a1( 10 );
    A a2( 20 );

    std::cout << "a1.x = " << a1.getX() << '\n';
    std::cout << "a2.x = " << a2.getX() << '\n';

    a1.swap( a2 );

    std::cout << "a1.x = " << a1.getX() << '\n';
    std::cout << "a2.x = " << a2.getX() << '\n';

    a1.swap( A( 30 ) );

    std::cout << "a1.x = " << a1.getX() << '\n';

    return 0;
}

Вывод программы:

a1.x = 10
a2.x = 20
a1.x = 20
a2.x = 10
a1.x = 30
0 голосов
/ 09 октября 2019

Ну, вы можете создать функцию-член и вызвать std::swap в вашем дереве:

class MyClass
{
public:
    void swapTrees(MyClass& other)
    {
        std::swap(tree, other.tree);
    }

private:
    Tree tree;    
};

Использование

MyCalss a, b;
a.swapTrees(b);
...