C++ 像C#这样编写代码合法吗?
例如: H CPP 让它像C一样。 不包括头,在CPP中重新声明类,但使用方法体。 当文件包含头文件时,他从CPP获取外部字段\方法等C++ 像C#这样编写代码合法吗?,c++,C++,例如: H CPP 让它像C一样。 不包括头,在CPP中重新声明类,但使用方法体。 当文件包含头文件时,他从CPP获取外部字段\方法等 合法吗?我无法从中预测问题。有?一个定义规则部分的3.2/5不允许这样做 一个类类型可以有多个定义(第9条),…[其他不重要的类型和条件] …并提供满足以下要求的定义。 给定在多个翻译中定义的名为D的实体 单位,那么 --D的每个定义应包含相同的令牌序列 如果标题包含在任何其他链接的翻译单元中,这显然禁止使用这种机制 如果你想写C,就用C写吧。如果你写惯用语C+
合法吗?我无法从中预测问题。有?一个定义规则部分的3.2/5不允许这样做 一个类类型可以有多个定义(第9条),…[其他不重要的类型和条件] …并提供满足以下要求的定义。 给定在多个翻译中定义的名为D的实体 单位,那么 --D的每个定义应包含相同的令牌序列 如果标题包含在任何其他链接的翻译单元中,这显然禁止使用这种机制
如果你想写C,就用C写吧。如果你写惯用语C++而不是方言,你将来的维护者会非常感激。 这属于一个定义规则的范畴。特别是,对于同一类,在单个程序的多个TU中对多个定义提出的要求是: […]-D的每个定义应包含相同的令牌序列[…] (3.2第5段一条定义规则[basic.def.odr])
因此,即使您“修复”了第一个版本来声明成员函数
inline
,以匹配第二个版本(其中提供成员的定义隐式声明它们inline
)你仍然会违反这条规则:函数体是出现在一个而不是另一个中的附加标记。一个主要问题是循环引用:如果类A
的代码包含类B
的实例,而该实例本身使用类A
,编译将失败
将类分为声明(.h)和定义(.cpp)解决了这个问题
但是:如果您仍然希望将类定义放在头文件中,可以通过将类设置为模板来实现,这实际上推迟了类型解析。但这是以增加编译时间为代价的 如果它编译并运行,那么它就是合法的。如果没有,那就不是了。simple@musefan有许多无效的C++编译得很干净。为什么你使用<代码> -> x <代码>而不是像<代码> x(x)< /> >初始化?@ MaseFa:什么是非法代码?代码>毒品。出售(大量)?@Mat:你应该小心地在公共场所发布此类代码,例如。。。10分钟后在后门见我,带上你最喜欢的文本编辑器。这不是真的。类定义可以重复,只是不能在同一个TU中重复。否则,您永远不会有两个TU使用同一个类。这是另一个问题的正确答案,但不是这个问题。OP建议在标题和.cppWhe中声明该类?对不起,我当时误解了他的问题。但我不会称之为“C#way”……关键是,只要源文件中不包含头文件,就不会有正式问题,因为头文件被忽略了completely@Qnan在我澄清这里的规则是关于在不同的TU中的多个定义之前,您可能已经阅读了我的答案。ODR在TU级别和程序级别分别工作。我不反对这一点,只是试图指出整个问题毫无意义的事实。它之所以能够编译,是因为头文件不包含在任何源文件中。@qn您可以在TU中定义一个类,然后将该定义复制并粘贴到另一个TU中,如果适当小心,您将拥有一个正确的程序。请记住,
#include
机制是根据文本包含来定义的——这些规则确实必须根据我所说的内容进行调整。他们是的,确实如此。从这里开始,一个好奇的头脑不需要太多的思考,如果这两个定义在某种程度上不同,会发生什么。这就是那个好奇的头脑的问题的答案。很好,我现在明白你的意思了。你认为这样做有什么好处吗?
class MyClass {
int x,y,z;
public:
MyClass(int,int,int);
void X();
void Y();
void Z();
};
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);
}
};