Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找类及其类型的成员变量列表?_C++_Copy Constructor - Fatal编程技术网

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

C++ 查找类及其类型的成员变量列表?,c++,copy-constructor,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) {} }; 我必须始终记住,如果我将另一个变量intk添加到类中,我还必须将其添加到初始化列表k(soc.k)中,有时还必须添加到析构函数中。 我已经多次添加/删除

我从来没有听说过这是可能的,但我满怀希望地问 对于成员变量比此多的类:

class A
{
 public:
  SomeOtherClass* s;
  int i;
  int j;
  A() {}
  A(const A& soc): s(soc.s->Clone()), i(soc.i), j(soc.j) {}
};
我必须始终记住,如果我将另一个变量
intk
添加到类中,我还必须将其添加到初始化列表
k(soc.k)
中,有时还必须添加到析构函数中。 我已经多次添加/删除成员变量,忘记在初始化列表中进行复制,并在调试时发现遗漏,这真的很烦人

因此,我想知道是否有一种语法/逻辑,通过它我可以找到一个类的成员变量列表及其类型,这样我就可以遍历它们,并决定哪些需要在复制ctor中复制,哪些需要深度复制


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

< P> C++中没有反射,所以需要一个外部库来完成这个操作。C++的创建者没有实现这个特性,因为它意味着性能的惩罚,性能是C++的主要目标之一。 我必须始终记住,如果我将另一个变量int k添加到类中,我还必须将其添加到初始化列表k(soc.k)中,有时还要添加到析构函数中

是的,你知道

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

是的

因此,我想知道是否有一种语法/逻辑,通过它我可以找到一个类的成员变量列表及其类型,这样我就可以遍历它们,并决定哪些需要在复制ctor中复制,哪些需要深度复制

不,没有

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

是的,理想情况下


C++不是真正的“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;}
模板结构检查\u大小;
模板结构检查_size{};
// ...
A(const A&soc):s(soc.s->Clone()),i(soc.i),j(soc.j){check\u size\u checker;}
请咨询

就这个话题发表看法


作为一个答案,基本上你不能这么做。

是的,它不能回答你的问题,但要解决你的问题,我在代码中所做的就是使用一个结构来保存可以自动复制的成员,这样我就不必担心它们了

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指针,这样我甚至不需要那个技巧(当我可以的时候,指针也会自动复制)

我不久前发了一篇关于它的帖子:

我不确定这是否能解决析构函数的问题(也许deep_copy指针会)


如果您感兴趣,我还建议您查看一下stackoverflow上关于memberspace的帖子,如果我没记错的话,这基本上是在其他方式上使用相同的技巧。

有外部库吗?什么样的性能损失(除了没有使用初始化列表的奢侈之外)?但是,选择使用初始化列表是什么使C++强大。我看不出出于性能原因而省略它的任何其他原因。不过,我从没试过这些。你可能想问一个关于哪个图书馆最好的问题。好吧,哪个图书馆最好:)我不知道:P你应该问一个单独的新问题。还有一些建议:我认为用反射来做这件事太过分了。正如他们在另一个问题中所说的,代码审查和单元测试是捕获此类错误的更好选择,而不是性能损失:为了实现反射,您需要将每个类的元数据存储在某个位置,这是主要原因。好吧,它可以是可选的,初始值设定项列表也是,但我相信比亚恩,他知道他的同事很惊讶地看到有人否决了我的答案,而我投了更高的票。不管是谁干的,你为什么这么做?我认为阿里给了反思概念一个正确的链接。我也认为这是一个建设性的答案,因为链接包含了对这个问题的明确答案。Downvoter,请写下你为什么这么做,如果我弄错了,我会修正自己。有趣的链接,但有点过时:它是从2009年开始的,在C++11升级之前。(没有投反对票;)