2017-02-12 62 views
0

有这句话在书C++底漆他们推出的头文件(第2.6.3节第76页第五版)前:C++入门级高清(初级)

When we define a class outside of a function, there may be only one definition of that class in any given source file. In addition, if we use a class in several different files, the class' definition must be the same in each file.

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

但是,我试图在两个不同的源文件中定义两个具有相同名称但具有不同内容的类。我甚至使用这些类,但它完美的作品。

+0

通常,_C++ Primer_将未定义的行为分类为类似于任何其他错误的错误,即使编译器不需要捕获所述错误:仅仅因为编译器不需要检测错误就不会使错误更少错误。 –

回答

1

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

+0

标准中的相关章节:[basic.def.odr]其中D是一个类:“如果D的定义满足所有这些要求,那么程序的行为应该与D的单一定义一样。如果定义的D不符合 这些要求,那么行为是不确定的。“其中一个要求基本上是定义是相同的(因为它们由相同的令牌等组成)。 –

+0

但为什么行为未定义?我认为没有头文件的不同源文件无法相互沟通。所以source_file1不知道source_file2有一个不同的类,但具有相同的名称,它们的行为像两个单独的文件,因此它们不应该相互冲突...... – gigi

+0

@gigi尽管它们不是不同的类。至少,他们不应该是。如果将指向该类的对象的指针传递给另一个文件中定义的函数,会发生什么?该指针应该指向哪个类? –

0

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