Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 像C#这样编写代码合法吗?_C++ - Fatal编程技术网

C++ 像C#这样编写代码合法吗?

C++ 像C#这样编写代码合法吗?,c++,C++,例如: H CPP 让它像C一样。 不包括头,在CPP中重新声明类,但使用方法体。 当文件包含头文件时,他从CPP获取外部字段\方法等 合法吗?我无法从中预测问题。有?一个定义规则部分的3.2/5不允许这样做 一个类类型可以有多个定义(第9条),…[其他不重要的类型和条件] …并提供满足以下要求的定义。 给定在多个翻译中定义的名为D的实体 单位,那么 --D的每个定义应包含相同的令牌序列 如果标题包含在任何其他链接的翻译单元中,这显然禁止使用这种机制 如果你想写C,就用C写吧。如果你写惯用语C+

例如:

H

CPP

让它像C一样。 不包括头,在CPP中重新声明类,但使用方法体。 当文件包含头文件时,他从CPP获取外部字段\方法等


合法吗?我无法从中预测问题。有?

一个定义规则部分的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);
    }
};