我从来没有听说过这是可能的,但希望可能会这样说 对于具有比此更多成员变量的类:
class A
{
public:
SomeOtherClass* s;
int i;
int j;
A() {}
A(const A& soc): s(soc.s->Clone()), i(soc.i), j(soc.j) {}
};
我总是要记住,如果我在类中添加另一个变量int k
,我还必须在初始化列表k(soc.k)
中添加它,有时也在析构函数中添加它。
我不得不多次添加/删除成员变量,忘记初始化列表中的复制并在调试时发现遗漏的确很烦人。
因此,我想知道是否有一个语法/逻辑,我可以通过它找到一个类及其类型的成员变量列表,以便我可以迭代它们并决定哪些需要被复制在复制ctor中,哪些需要被深层复制?
我不明白为什么C ++的创建者不能包含这样的工具,因为除了虚拟成员之外,变量的内存位置也是连续的,它们的类型也是已知的。即使它们是extern或virtual,也会在运行时知道类型和大小。那不应该可能吗?
答案 0 :(得分:12)
C ++中没有反射,因此您需要一个外部库来执行此操作。 C ++的创建者没有实现这个功能,因为它意味着性能损失,性能是C ++的主要目标之一。
答案 1 :(得分:3)
我总是要记住,如果我将另一个变量int k添加到类中,我还必须将它添加到初始化列表k(soc.k)中,有时也添加到析构函数中。
是的,你这样做。
我不得不多次添加/删除成员变量,忘记初始化列表中的复制并在调试时发现遗漏很烦人。
是的,是的。
因此,我想知道是否有一个语法/逻辑,我可以通过它找到一个类及其类型的成员变量列表,以便我可以迭代它们并决定哪些需要被复制在复制ctor中,哪些需要被深层复制?
不,没有。
我不明白为什么C ++的创建者不能包含这样的工具,因为除了虚拟成员之外,变量的内存位置也是连续的,它们的类型也是已知的。即使它们是extern或virtual,也会在运行时知道类型和大小。那不应该可能吗?
是的,理想情况下。
C ++并不是真正的“那种语言”,但 有点痛苦。
答案 2 :(得分:2)
答案 3 :(得分:1)
是的,它没有回答你的问题,但为了解决你的问题,我在我的代码中所做的是使用结构来保存可以自动复制的成员,这样我就不必担心它们。
class A
{
public:
SomeOtherClass* s;
class Members
{
int i;
int j;
};
Members m;
A() {}
A(const A& soc): s(soc.s->Clone()), m(soc.m) {}
void f() {
m.j;//use j
}
};
但一般来说我更喜欢使用deep_copy指针,所以我甚至不需要那个技巧(当我可以时,指针也会自动复制)。
前段时间我发布了这个帖子:https://stackoverflow.com/questions/469696/what-is-your-most-useful-c-c-utility/1609496#1609496。
我不确定这会解决你的析构函数问题(也许是deep_copy指针)。
如果你有兴趣,我还建议在stackoverflow上检查那些正在讨论成员空间的帖子,如果我没记错的话,基本上使用同样的技巧用于其他方法。
答案 4 :(得分:0)
如上所述,C ++中没有任何反映。你可能做的一件简单的事就是检查班级的大小。如果您在添加成员后忘记更新大小,则至少可以通过生成错误消息来查看正确的位置。
示例:
template<size_t Real, size_t Expected> struct check_size;
template<size_t Size> struct check_size<Size, Size> {};
// ...
A(const A& soc): s(soc.s->Clone()), i(soc.i), j(soc.j) {check_size<sizeof(A), 24> size_checker;}