Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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++入门书中有一个句子在引入头文件(第2.6页第76版第第五版):_C++ - Fatal编程技术网

C++;初级课程定义(初学者) 在C++入门书中有一个句子在引入头文件(第2.6页第76版第第五版):

C++;初级课程定义(初学者) 在C++入门书中有一个句子在引入头文件(第2.6页第76版第第五版):,c++,C++,当我们在函数外部定义一个类时,在任何给定的源文件中,该类可能只有一个定义。此外,如果我们在几个不同的文件中使用一个类,那么每个文件中的类定义必须相同 我解释最后一句话的方式可能有问题。我的理解是,如果我想在同一个项目的多个文件中使用一个类而不使用头,我必须在每个文件中定义该类。每个文件中的类都必须具有相同的名称和内容,否则编译器会抱怨 但是,我尝试在两个不同的源文件中定义两个名称相同但内容不同的类。我甚至使用了这些类,但它非常有效。正式地说,拥有同一类的两个不同定义不需要诊断(即,没有警告或错误

当我们在函数外部定义一个类时,在任何给定的源文件中,该类可能只有一个定义。此外,如果我们在几个不同的文件中使用一个类,那么每个文件中的类定义必须相同

我解释最后一句话的方式可能有问题。我的理解是,如果我想在同一个项目的多个文件中使用一个类而不使用头,我必须在每个文件中定义该类。每个文件中的类都必须具有相同的名称和内容,否则编译器会抱怨


但是,我尝试在两个不同的源文件中定义两个名称相同但内容不同的类。我甚至使用了这些类,但它非常有效。

正式地说,拥有同一类的两个不同定义不需要诊断(即,没有警告或错误消息)。但是行为是“未定义的”,也就是说,语言定义没有告诉您代码应该做什么。因此,代码可以做任何事情,包括工作正常。当然,直到您为最重要的客户演示您的程序时,它才会崩溃。

它不能完美地工作。它可能已经起作用,但使定义不同是未定义的行为。

标准中的相关章节:[basic.def.odr]其中D是一个类:“如果D的定义满足所有这些要求,那么程序的行为就好像只有一个D的定义一样。如果D的定义不满足这些要求,那么行为就没有定义。”其中一个要求基本上是定义是相同的(因为它们由相同的标记组成,等等)。但为什么行为没有定义?我认为没有头的不同源文件之间没有通信的方式。因此,source_file1不知道source_file2有不同的类,但名称相同,它们就像两个独立的文件,所以它们不应该相互冲突…@gigi,但它们不是不同的类。在least,它们不应该是。如果将指向该类对象的指针传递给另一个文件中定义的函数,会发生什么情况?该指针应该指向哪个类?@gigi——令人不满意的答案是,它是未定义的,因为语言定义是这样说的。假设您有两个名为
X
的类,每个类都有一个membER函数名为“代码>y< /CODE >,不带任何参数。传统的链接器无法处理复制:在两个不同的对象文件中,有两个同名函数,链接器要么抱怨要么选择一个供整个程序使用。实际上,没有什么好的方法。一般来说,C++引物分类。与任何其他错误一样,未定义的行为是一种错误,即使编译器不需要捕获所述错误:仅仅因为编译器不需要检测错误,也不会减少错误。