📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| 207行目: | 207行目: | ||
これにより、クラスのインスタンスが移動されることを防ぐ。<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> | ||