簡體   English   中英

C ++從重載的副本分配運算符調用默認副本分配運算符

[英]C++ call default copy assignment operator from overloaded copy assignment operator

我想使用副本分配運算符的默認功能,但可以在操作中執行一些其他任務。 因此基本形式如下所示:

class Test
{
    void operator=(Test& that)
    {
        *this = that; //do the default copy operation
        this->foo()  //perform some other tasks
    }
};

通過創建copy()函數可以輕松完成此操作,但是保留“ =”操作的整潔度可能會很好。

您可以使用基本實現類,並從子類委托給base operator=

// Fill this class with your implementation.
class ClsImpl {
  // some complicated class
 protected:
  ~ClsImpl() = default;
};

class Cls : public ClsImpl {
 public:
  Cls& operator=(const Cls& other) {
    if (this == &other) { return *this; }
    // assign using the base class's operator=
    ClsImpl::operator=(other); // default operator= in ClsImpl
    this->foo(); // perform some other task
    return *this;
  }
};

一種方法是再次從派生類派生以提供復制后邏輯。

#include <iostream>


// a wrapper class to provide custom copy actions

template<class Base>
struct CopyActions : Base
{
    using base_class = Base;
    using CopyActions::base_class::base_class;

    // copy operator will call the base and then perform custom action

    CopyActions& operator=(const CopyActions& r) {
        base_class::operator=(r);
        onCustomCopy(r, *this);
        return *this;
    }
};

// a class to notify us when a copy takes place, without having to write
// custom copy operators
struct copy_sentinel
{
    copy_sentinel operator=(const copy_sentinel&) {
        std::cout << "copying " << name << '\n';
        return *this;
    }
    const char* name;
};


int test_count = 0;

// a model base class
struct MyBase
{
    int base_count = test_count++;
    copy_sentinel base_s { "MyBase" };
};

// a model derived class containing only logic
struct MyDerived : MyBase
{
    int derived_count = test_count++;
    copy_sentinel base_s { "MyDerived" };
};

// a custom copy action (free function)
void onCustomCopy(const MyDerived& from, MyDerived& to)
{
    std::cout << "custom copy action\n";
}

// our derived class with custom copy actions
using SuperDerived = CopyActions<MyDerived>;

// test
int main()
{
    SuperDerived a;  // 0, 1
    SuperDerived b;  // 2, 3

    // prove initial values
    std::cout << a.base_count << ", " << a.derived_count << std::endl;

    // perform copy and report actions
    a = b;

    // prove a copy occurred
    std::cout << a.base_count << ", " << a.derived_count << std::endl;
}

預期成績:

0, 1
copying MyBase
copying MyDerived
custom copy action
2, 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM