📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
207行目: 207行目:
これにより、クラスのインスタンスが移動されることを防ぐ。<br>
これにより、クラスのインスタンスが移動されることを防ぐ。<br>
<br>
<br>
これらは、以下に示すようなメリットがある。<br>
これらのマクロは、以下に示すようなメリットがある。<br>
* オブジェクトの意図しない複製や移動を防ぐことができる。
* オブジェクトの意図しない複製や移動を防ぐことができる。
* リソースの所有権に関する問題を回避できる。
* リソースの所有権に関する問題を回避できる。
* クラスの設計意図を明確に示すことができる。
* クラスの設計意図を明確に示すことができる。
<br>
以下の例では、クラスのインスタンスがコピーや移動されることを防ぐ方法を示している。<br>
これにより、意図しないオブジェクトの複製や移動を防ぎ、リソース管理を適切に行うことができる。<br>
<br>
<syntaxhighlight lang="c++">
// NonCopyable.hファイル
class NonCopyable
{
private:
    Q_DISABLE_COPY(NonCopyable)
public:
    NonCopyable()  = default;
    ~NonCopyable() = default;
    void doSomething() { qDebug() << "Doing something"; }
};
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// NonMovable.hファイル
class NonMovable
{
private:
    Q_DISABLE_MOVE(NonMovable)
public:
    NonMovable()  = default;
    ~NonMovable() = default;
    void doSomething() { qDebug() << "Doing something"; }
};
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// 使用例
#include "NonCopyable.h"
#include "NonMovable.h"
void testNonCopyable()
{
    NonCopyable nc1;
    // NonCopyable nc2 = nc1;  // コンパイルエラー: コピーコンストラクタは削除されている
    // NonCopyable nc3(nc1);  // コンパイルエラー: コピーコンストラクタは削除されている
    // nc1 = NonCopyable();    // コンパイルエラー: コピー代入演算子は削除されている
    nc1.doSomething();        // コンパイル可能
}
void testNonMovable()
{
    NonMovable nm1;
    // NonMovable nm2 = std::move(nm1);  // コンパイルエラー: ムーブコンストラクタは削除されている
    // nm1 = NonMovable();              // コンパイルエラー: ムーブ代入演算子は削除されている
    nm1.doSomething();                  // コンパイル可能
}
int main()
{
    testNonCopyable();
    testNonMovable();
    return 0;
}
</syntaxhighlight>
<br>
<br>