静的メソッドと変数
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 31/104。
静的メンバーはすべてのオブジェクト間で共有されることを学びました。次に、静的変数とともに静的メソッドを適切に定義して使用する方法を見ていきましょう。
クラス内で宣言された静的変数は、通常はソースファイル内でクラスの外部で定義する必要があります。これは、静的メンバーにはすべてのオブジェクトで共有される、まったく1つの記憶領域が必要だからです。
class Counter {
static int count; // 宣言のみ
public:
Counter() { count++; }
~Counter() { count--; }
static int getCount() { // 静的メソッド
return count;
}
};
// 定義 - クラスの外で必要
int Counter::count = 0;静的メソッドは、どのオブジェクトにも属さず、クラスに属します。これには重要な帰結があります。静的メソッドはインスタンスメンバーにアクセスしたり、thisポインターを使用したりできません。特定のオブジェクトに対して呼び出されるものではないためです。
class MathUtils {
static double pi;
public:
static double circleArea(double radius) {
return pi * radius * radius; // 静的メンバーにアクセスできる
}
};
double MathUtils::pi = 3.14159;
// オブジェクトなしで呼び出される
double area = MathUtils::circleArea(5.0);静的メソッドは、オブジェクトの状態を必要としないユーティリティ関数、オブジェクトを作成するファクトリメソッド、または静的データへのアクセスに最適です。オブジェクトインスタンスを必要としないため、class名とスコープ解決演算子を使って呼び出します: ClassName::methodName()。
チャレンジ
簡単オブジェクトインスタンスを必要とせずにクラスレベルの機能を提供するために、static methods と変数がどのように連携するかを示す、ユニークな ID ジェネレーターシステムを構築しましょう。
コードを整理するために、2つのファイルを作成します。
IDGenerator.h:連続するユニークな ID を生成するIDGeneratorclass を Define します。class には次の要素が必要です。- 割り当てる次の ID を追跡する private static member
nextId(1000から開始) - すべての ID 用にカスタマイズ可能なプレフィックスを格納する private static member
prefix(string) - プレフィックスを変更する static method
setPrefix(const std::string& p) - プレフィックスと現在の ID 番号を組み合わせた string を返し、次の Call に備えて
nextIdをインクリメントする static methodgetNextId() - カウンターをインクリメントせずに、次の ID が何になるかを返す static method
peekNextId() - 生成された ID の数を返す static method
getGeneratedCount()(ヒント:開始値と現在のnextIdから計算します) nextIdを1000に戻す static methodreset()
static members は class Definition の後、class の外側で Define してください。
prefixは"ID-"に Initialize します。- 割り当てる次の ID を追跡する private static member
main.cpp:オブジェクトを作成せず、class 名を使用して static methods を Call する方法を示します。input からカスタムプレフィックスを読み取り、次の処理を行います。peekNextId()を使用して"Peek: <peeked_id>"を出力するgetNextId()を使用して3つの ID を Generate し、それぞれを"Generated: <id>"として出力する- 生成された ID の数を示す
"Count: <count>"を出力する setPrefix()を使用し、input の値でプレフィックスを変更する- さらに2つの ID を Generate し、それぞれを
"Generated: <id>"として出力する - もう一度
"Count: <count>"を出力する reset()を Call する"After reset - Peek: <peeked_id>"を出力する"After reset - Count: <count>"を出力する
IDGenerator オブジェクトを一度も作成していないことに注目してください。すべての methods は、IDGenerator::methodName() を使用して class 上で直接 Call されます。これが static methods の主要な特徴です。static methods は class 自体に属し、特定のインスタンスには属しません。
header file に <string> と <iostream> を include し、header guards も忘れずに記述してください。
自分で試してみよう
#include <iostream>
#include <string>
#include "IDGenerator.h"
using namespace std;
int main() {
// 入力からカスタムプレフィックスを読み取る
string customPrefix;
cin >> customPrefix;
// TODO: peekNextId() を使用して "Peek: <peeked_id>" を出力する
// TODO: getNextId() を使用して3つのIDを生成し、それぞれを "Generated: <id>" として出力する
// TODO: 生成されたIDの数を示す "Count: <count>" を出力する
// TODO: setPrefix() を使用して入力値でプレフィックスを変更する
// TODO: さらに2つのIDを生成し、それぞれを "Generated: <id>" として出力する
// TODO: 再度 "Count: <count>" を出力する
// TODO: reset() を呼び出す
// TODO: Print "After reset - Peek: <peeked_id>"
// TODO: Print "After reset - Count: <count>"
return 0;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ