Можно ли объявить operator = private и одновременно синтезировать его компилятором в C ++? - PullRequest
4 голосов
/ 25 января 2012

Я доволен оператором =, который автоматически синтезируется компилятором.Но я хочу, чтобы он был закрытым, и я не хочу раздувать свой код с помощью длинных определений типа

Foo& Foo::operator= (const Foo& foo)
{
    if (this == &foo)
        return *this;

    member1_    = foo.member1_;
    member2_    = foo.member2_;
    member3_    = foo.member2_;
    ...
    member1000_ = foo.member1000_;

    return *this;
} 

Пожалуйста, есть ли способ сделать это?

Ответы [ 2 ]

8 голосов
/ 25 января 2012

В C ++ 11 это:

class Foo
{
    Foo& operator=(const Foo& source) = default;
public:
    // ...
};

К сожалению, большинство компиляторов еще не реализовали эту часть нового стандарта.

1 голос
/ 25 января 2012

Другой вариант - использовать идиому Pimpl.

class Foo {
public:
    Foo() : pImpl(new FooImpl) {}
    // ... Foo's public interface, same as before
private:
    Foo& operator=(const Foo& source);  //- Foo's assignment operator is private

    struct FooImpl;
    boost::scoped_ptr<FooImpl>  pImpl;
};

struct FooImpl {
    // ... all the private data members that use to be in Foo
    // Note: using the compiler generated copy assignment operator
};  

Оператор назначения копирования является частным от клиентов POV Foo, но вы все равно можете использовать назначение копирования, созданное компилятором, через FooImpl.Компромисс приходит при реализации функций-членов Foo, так как теперь вам нужно обращаться к данным через указатель pImpl.

...