C++ 是否允许类在程序中的不同翻译单元之间具有不同的定义?

C++ 是否允许类在程序中的不同翻译单元之间具有不同的定义?,c++,linkage,one-definition-rule,C++,Linkage,One Definition Rule,如果在每个翻译单元中最多定义一次类,那么在不同的翻译单元中定义不同的类是否形式良好 用例访问实现细节而不进行动态分配。C++代码将对C库已经分配的指针进行操作。 为了举例说明,请忽略内存泄漏 通用hpp #pragma一次 名称空间测试{ 类Impl; 甲级{ 无效*ptr; A(void*ptr):ptr(ptr){} 好友类Impl; 公众: int加_one(); }; B类{ 无效*ptr; B(void*ptr):ptr(ptr){} 好友类Impl; 公众: int加上二(); };

如果在每个翻译单元中最多定义一次类,那么在不同的翻译单元中定义不同的类是否形式良好

用例访问实现细节而不进行动态分配。C++代码将对C库已经分配的指针进行操作。 为了举例说明,请忽略内存泄漏

通用hpp

#pragma一次
名称空间测试{
类Impl;
甲级{
无效*ptr;
A(void*ptr):ptr(ptr){}
好友类Impl;
公众:
int加_one();
};
B类{
无效*ptr;
B(void*ptr):ptr(ptr){}
好友类Impl;
公众:
int加上二();
};
阶级工厂{
公众:
A getA(int-val);
B getB(int-val);
};
}//名称空间测试
A.cpp

#包括“common.hpp”
名称空间测试{
类Impl{
公众:
static int as_int(A*A){return*static_cast(A->ptr)+1;}
};
inta::plus_one(){return Impl{}.as_int(this);}
}//名称空间测试
B.cpp

#包括“common.hpp”
名称空间测试{
类Impl{
公众:
static int as_int(B*B){return*static_cast(B->ptr)+2;}
};
intB::plus_two(){return Impl{}.as_int(this);}
}//名称空间测试
Factory.cpp

#包括“common.hpp”
名称空间测试{
类Impl{
公众:
静态A getA(int val){返回A(new int{val});}
静态B getB(int val){返回B(new int{val});}
};
工厂::getA(int val){return Impl{}.getA(val);}
B工厂::getB(int val){return Impl{}.getB(val);}
}//名称空间测试
main.cpp

#包括
#包括“common.hpp”
int main(){
测试:工厂;

std::cout否,同一类类型不允许有不同的定义。您的程序直接违反了ODR,并且表现出未定义的行为

[basic.def.odr]

在中,类类型[…]可以有多个定义 一种程序,只要每个定义以不同的格式出现 翻译单位,并提供满足以下要求的定义 要求。给定一个以上定义的名为D的实体 翻译单位,那么

  • D的每个定义应包含相同的令牌序列;以及
  • [……]
[…]如果D的定义满足所有这些要求,则 行为就像对D有一个单一的定义 D的定义不满足这些要求,那么行为 没有定义

您的两个定义在它们的令牌序列上已经非常明显地不同了,因此ODR的条件没有得到支持

$ g++ A.cpp B.cpp Factory.cpp main.cpp -o test 
$ ./test
2
3