Menu
CoddyTech

インスタンス変数と静的変数

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 9/65。

クラス内の通常のvarはインスタンス変数です。各オブジェクトがそれぞれ独自の値を持ちます。一方、static varはクラスに属し、値は1つだけで、すべてのオブジェクトで共有されます。

# student.gd
class_name Student
extends RefCounted

static var school: String = "Godot High"
static var count: int = 0
var student_name: String

func _init(new_name: String) -> void:
	student_name = new_name
	count += 1
var ada := Student.new("Ada")
var bo := Student.new("Bo")
print(Student.count) # 2
print(ada.student_name, " and ", bo.student_name) # Ada and Bo
Student.school = "Godot Academy"
print(ada.school) # Godot Academy
print(bo.school) # Godot Academy

Student.count のように、オブジェクトを使わずにクラス名を通じて静的変数を読み取ります。クラス内ではその名前を使います。_init() 内の count += 1 は、これまでに作成された学生の数を数えます。

Student.schoolを変更すると、すべての生徒について一度に変更されます。ada.school = "Night School"でも同じことが起こります。schoolは1つしかないため、クラス名を使って書くとそのことが明確になります。

constも同じように共有されますが、変更することはできません。カウンターやすべてのオブジェクトに適用される設定など、プログラムの実行中に変化する共有データにはstatic varを使います。

challenge icon

チャレンジ

簡単

bank_account.gd のクラス BankAccount を完成させてください。

  • すべてのアカウントで共有され、初期値が 2 の静的な int 変数 interest_percent
  • 初期値が 0 の静的な int 変数 account_count。コンストラクターは、新しいアカウントを作成するたびにこれに 1 を加えます。
  • describe() は、アカウントの holder と balance、および共有の interest_percent を使って HOLDER: $BALANCE at PERCENT% を返します。

提供されているコードは、後続するアカウントの数と、それぞれの holder balance の行を読み取り、その後、新しい利率を読み取ります。BankAccount.account_count とすべてのアカウントを出力し、BankAccount.interest_percent を新しい利率に設定してから、すべてのアカウントをもう一度出力します。Alice 1000、Bob 2000、利率 3 の場合、次のように出力されます。

Accounts opened: 2
Alice: $1000 at 2%
Bob: $2000 at 2%
After the rate change:
Alice: $1000 at 3%
Bob: $2000 at 3%

コードは bank_account.gd に記述してください。main.gd には提供された入出力コードがあり、編集できません。

自分で試してみよう

extends Node

func _ready():
	# 提供された入出力コード:そのままにしてください
	var accounts: Array[BankAccount] = []
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		accounts.append(BankAccount.new(parts[0], int(parts[1])))
	print("Accounts opened: %d" % BankAccount.account_count)
	for account in accounts:
		print(account.describe())
	BankAccount.interest_percent = int(OS.read_string_from_stdin())
	print("After the rate change:")
	for account in accounts:
		print(account.describe())
quiz icon腕試し

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

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

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