C++应使用哪个类

Which class should be used by C++?

本文关键字:C++      更新时间:2023-10-16

我认为描述有点棘手。但我尽力了...

鉴于:

一个程序 (Prog_A(

一个库 (Lib_A( 与Class_A类

以及一个库(Lib_B(,带有(也(一个类Class_A并具有成员Class_A mClass_A

两个类Class_A都具有函数

void Class_A::DoSome(){
...
}

对于Lib_A Class_A

void Class_A::DoSome(){
std::cout << "LIB_A";
}

对于Lib_B的Class_A

void Class_A::DoSome(){
std::cout << "LIB_B";
}

Prog_A包括Lib_A,Lib_A包括Lib_B。Lib_A和Lib_B通过回调"连接"。如果我现在在Lib_B中调用mClass_A.DoSome((,那么它正在打印

LIB_A

而不是我的期望"LIB_B"。

这种行为是正确的,还是我必须担心?

你的代码是错误的。您已经定义了两次Class_A,但定义不匹配。

这是不允许的

[C++11: 3.2/3]每个程序应只包含该程序中使用的每个非内联函数或变量的一个定义;无需诊断。定义可以显式出现在程序中,可以在标准或用户定义的库中找到,或者(在适当时(隐式定义(参见 12.1、12.4 和 12.8(。内联函数应在使用它的每个翻译单元中定义

[C++11: 3.2/5]类类型(子句 9(、枚举类型 (7.2(、具有外部链接的内联函数 (7.1.2(、类模板(子句 14(、非静态函数模板 (14.5.6(、类模板的静态数据成员 (14.5.1.3(、类模板的成员函数 (14.5.1.1( 或未指定某些模板参数的模板专用化 (14.7, 14.5.5(在程序中,前提是每个定义出现在不同的翻译单元中,并且该定义满足以下要求。给定这样一个在多个翻译单元中定义的名为 D' 的实体,则

  • D的每个定义应由相同的令牌序列组成;
  • [..]

如果你直接构建整个程序,你会在链接时得到一个多重定义错误;但是,由于你是动态链接的,这是不可能的,你的程序只是被破坏了。

使用命名空间将定义彼此分开。

在共享库中使用我在 Stack Overflow 上找到的自定义boost::lexical_cast专用化时,我设法意外地导致了这个问题,没有意识到原始的"默认"专用化已在单独的共享库中实例化。我从主应用程序中得到的行为非常不可预测。

相关文章:
  • 没有找到相关文章