查找类及其类型的成员变量列表?

时间:2011-06-17 13:25:02

标签: c++ copy-constructor

我从来没有听说过这是可能的,但希望可能会这样说 对于具有比此更多成员变量的类:

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,也会在运行时知道类型和大小。那不应该可能吗?

5 个答案:

答案 0 :(得分:12)

C ++中没有反射,因此您需要一个外部库来执行此操作。 C ++的创建者没有实现这个功能,因为它意味着性能损失,性能是C ++的主要目标之一。

答案 1 :(得分:3)

  

我总是要记住,如果我将另一个变量int k添加到类中,我还必须将它添加到初始化列表k(soc.k)中,有时也添加到析构函数中。

是的,你这样做。

  

我不得不多次添加/删除成员变量,忘记初始化列表中的复制并在调试时发现遗漏很烦人。

是的,是的。

  

因此,我想知道是否有一个语法/逻辑,我可以通过它找到一个类及其类型的成员变量列表,以便我可以迭代它们并决定哪些需要被复制在复制ctor中,哪些需要被深层复制?

不,没有。

  

我不明白为什么C ++的创建者不能包含这样的工具,因为除了虚拟成员之外,变量的内存位置也是连续的,它们的类型也是已知的。即使它们是extern或virtual,也会在运行时知道类型和大小。那不应该可能吗?

是的,理想情况下。

C ++并不是真正的“那种语言”,但 有点痛苦。

答案 2 :(得分:2)

请咨询 http://yosefk.com/c++fqa/defective.html#defect-6

有关该主题的观点。

作为答案,基本上你不能这样做。

答案 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;}