我对C ++缺乏经验,我正在努力理解这段代码的作用。
template <typename T>
class System : public BaseSystem
{
[..]
private:
static SystemType sysType;
};
在课堂定义之外有类似的东西:
template <typename T>
SystemType System<T>::sysType= IDGen<BaseSystem>::GenerateNextID();
这是将sysType
类中的System
字段设置为新ID吗?但由于sysType
字段为private
,它如何才能访问它?另外,为什么在分配之前包含类型?
如果我想更改字段,我会执行类似field = newvalue;
的操作,但是Foo field = newvalue;
似乎正在创建类型为Foo
的新字段,然后分配它。
任何人都可以解释这行代码的作用吗?
答案 0 :(得分:7)
这不是“任务”。它是您班级的静态数据成员sysType
的定义。在您的情况下,语法包含相当多的与模板相关的内容,但问题的直接问题与模板完全没有关系。同一事物的简约示例可能如下所示
class SomeClass {
...
static int i; // declaration of `SomeClass::i`
...
};
int SomeClass::i = 42; // definition of `SomeClass::i`
该类的所有静态成员必须在某处定义(对于常量积分成员有一些例外)。你在课堂上所拥有的仅仅是声明。
所以,还有一次:每次你在你的类中声明一个静态数据成员时,你将不得不在类之外的某个地方定义具有外部链接的数据对象的一个定义规则,即您必须在程序中定义一次且仅一次。
在您的情况下,定义包括初始化程序。 =
是初始化语法的一部分。它与作业无关。
访问保护根本不起作用。在这种情况下,您不是访问类成员,而是定义它。就像您在类外部定义私有成员函数一样,您在类之外定义私有静态成员。