C++ 是否允许类在程序中的不同翻译单元之间具有不同的定义?
如果在每个翻译单元中最多定义一次类,那么在不同的翻译单元中定义不同的类是否形式良好 用例访问实现细节而不进行动态分配。C++代码将对C库已经分配的指针进行操作。 为了举例说明,请忽略内存泄漏 通用hppC++ 是否允许类在程序中的不同翻译单元之间具有不同的定义?,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加上二(); };
#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