Delphi Class variable per class
class, delphi, variables
Solution
You are missing nothing. Your analysis of how class variables work is correct. A class var is nothing more than a global variable that is scoped by the class.
One simple solution for you is to use a dictionary to count the instances. A more hacky approach is to use a trick of mine that Hallvard Vassbotn blogged about, which (ab)uses the VMT to store class-specific fields. You can read all about it here.
Problem
I've added a class variables to the base class of a deep class hierarchy. It's an integer intended to count number of instances created per class type. But I've run into a problem. Given the example: ``` TBaseClass = class private class var fCreated: integer; public class function NewInstance: TObject; override; end; TDescendant = class(TBaseClass) end; ... class function TBaseClass.NewInstance: TObject; begin result := inherited NewInstance; inc(fCreated); end; ``` I assumed that I can use the class var to store the number of instances created per class, but this does not seem to be the case. Inspecting `TBaseClass.fCreated` returns same value as `TDescendant.fCreated`, changing one via inspector changes the other, so it behaves as if `fCreated` is a single global var. I expected `fCreated` to be maintained per class type, isn't that the point ? What am I missing ?