【发布时间】:2018-11-05 21:26:41
【问题描述】:
我看到了一些我在这篇帖子 vector of structs inline initialization. braced-init-list 中描述的奇怪行为
我希望消除未定义行为的一种可能来源。我有以下两个类A 和B,它们都前向声明struct Foo,但cpp 文件定义了如下的实际结构。
// This is A.h
namespace app {
struct Foo;
class A {
private:
std::vector<Foo> fooList;
};
}
// This is A.cpp
struct app::Foo {
std::string first;
std::string second;
unsigned flag;
};
// This is B.h
namespace app {
struct Foo;
class B {
private:
std::vector<Foo> fooList;
};
}
// This is B.cpp
struct app::Foo {
std::string first;
std::string second;
bool flag;
float value;
};
请注意,结构 Foo 在 cpp 文件 A.cpp、B.cpp 中有不同的成员。 A 和 B 类永远不会暴露成员 fooList。是否有可能因为前向声明完全相同,在文件A.h 和B.h 的结构Foo 中,生成的代码可能使用其中一个或另一个。这可以解释我在链接问题中看到的问题。
换句话说,当对B.cpp 中调用的结构Foo 使用花括号初始化列表时,是否可以保证使用B.cpp 中定义的Foo,或者同样可能使用Foo A.cpp中定义的也可以用吗?
即使在我写这篇文章的时候,我也立即意识到这个实现是一种不好的做法,因为Foo 本身是类A 和B 的内部,并且确实应该在类的私有部分中声明自己。
【问题讨论】:
-
请注意,C++ 标准不允许
vector的不完整类型。所以你的代码不符合标准。 -
@juanchopanza 只要构造函数和析构函数可以访问定义,就可以了。