示例:
ħ
class MyClass {
int x,y,z;
public:
MyClass(int,int,int);
void X();
void Y();
void Z();
};
CPP
class MyClass {
int x,y,z;
public:
MyClass(int x,int y,int z) {
this->x=x;
this->y=y;
this->z=z;
}
void X() {
printf("x = %d;\n",x);
}
void Y() {
printf("y = %d;\n",y);
}
void Z() {
printf("z = %d;\n",z);
}
};
使它像C#一样。 不要包含标题,在CPP中重新声明类,但使用方法体。 当文件包含标题时,他从CPP获得extern字段\方法等。
这是合法的吗?我无法预测它的问题。有吗?
答案 0 :(得分:11)
这属于One Definition Rule的范畴。特别是,针对同一个类的单个程序的多个TU上的多个定义的要求是:
[...] - D的每个定义应由相同的令牌序列[...]
组成
(3.2定义规则[basic.def.odr]的第5段)
所以,即使你'修复'第一个版本来声明成员函数inline
以匹配第二个版本(其中提供成员的定义隐式声明它们inline
),你仍然会遇到冲突此规则:函数体是附加的标记,它们出现在另一个中但不在另一个中。
答案 1 :(得分:5)
一个定义规则部分的3.2 / 5不允许这样做。
类类型可以有多个定义(第9条),...... [其他类型和条件并不重要]
......并且定义满足以下要求。 鉴于这样一个名为D的实体在多个翻译中定义 单位,然后
- D的每个定义应由相同的令牌序列组成;
如果标题包含在任何其他链接的翻译单元中,这明显禁止这样的机制。
如果你想编写C#,只需用C#编写即可。如果您编写惯用的C ++而不是方言,您的未来维护者将非常感激。
答案 2 :(得分:-1)
一个主要问题是循环引用:如果类A
的代码包含类B
的实例,它本身使用类A
,则编译将失败。
将类分离为其声明(.h)和定义(.cpp)可以解决此问题。
但是:如果你仍然希望将类定义放在头文件中,可以通过使类成为模板来实现,从而有效地推迟类型解析。但这是以增加编译时间为代价的! p>