Menu
Coddy logo textTech

静的メソッドと変数

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()

challenge icon

チャレンジ

簡単

オブジェクトインスタンスを必要とせずにクラスレベルの機能を提供するために、static methods と変数がどのように連携するかを示す、ユニークな ID ジェネレーターシステムを構築しましょう。

コードを整理するために、2つのファイルを作成します。

  • IDGenerator.h:連続するユニークな ID を生成する IDGenerator class を Define します。class には次の要素が必要です。
    • 割り当てる次の ID を追跡する private static member nextId1000 から開始)
    • すべての ID 用にカスタマイズ可能なプレフィックスを格納する private static member prefix(string)
    • プレフィックスを変更する static method setPrefix(const std::string& p)
    • プレフィックスと現在の ID 番号を組み合わせた string を返し、次の Call に備えて nextId をインクリメントする static method getNextId()
    • カウンターをインクリメントせずに、次の ID が何になるかを返す static method peekNextId()
    • 生成された ID の数を返す static method getGeneratedCount()(ヒント:開始値と現在の nextId から計算します)
    • nextId1000 に戻す static method reset()

    static members は class Definition の後、class の外側で Define してください。prefix"ID-" に Initialize します。

  • 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;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: C++オンラインコンパイラ