C++ C++;什么';定义递归构造函数的标准方法是什么?

C++ C++;什么';定义递归构造函数的标准方法是什么?,c++,constructor,grammar,recursive-datastructures,C++,Constructor,Grammar,Recursive Datastructures,对不起,我现在编辑了我的问题。请注意粗体字 在定义kdtree类时,我确实需要一个递归构造函数。 但恐怕我做得不对。 我怎样才能做得更优雅呢 这是我使用This指针编写的代码,编译后运行良好。 什么都不做,只是简单介绍递归构造函数应该是什么样子 #include <iostream> using namespace std; class foo { public: int a, b; foo(unsigned int k)//this piece of code just

对不起,我现在编辑了我的问题。请注意粗体字

在定义kdtree类时,我确实需要一个递归构造函数。 但恐怕我做得不对。 我怎样才能做得更优雅呢

这是我使用This指针编写的代码,编译后运行良好。 什么都不做,只是简单介绍递归构造函数应该是什么样子

#include <iostream>
using namespace std;

class foo
{
public:
  int a, b;
  foo(unsigned int k)//this piece of code just shows the brief idea of what i'm trying to do.
  {
    if (k)
      *this = foo(--k);
    else
      a = k, b = k;
  }
};

int main()
{
  foo f(3);
  cout << f.a << f.b << endl;
  getchar();
}
#包括
使用名称空间std;
福班
{
公众:
INTA,b;
foo(unsigned int k)//这段代码只是简单介绍了我要做的事情。
{
如果(k)
*这=foo(--k);
其他的
a=k,b=k;
}
};
int main()
{
傅f(3),;

cout构造函数只构建一个东西,所以不能使用构造函数来构建一组东西

如果使用新类[20];//将分配20个类,但每个类在构造函数中构造一次

class Class
{
    Class * left;
    Class * right;
    Class(  SomeObject & x )
    {
         eatSomeData( x );
         left = nullptr;
         right = nullptr;
         if (x->buildleft() )
             left = new Class( x );
         if (x->buildright() )
             right = new Class( x );
    }
};
在每次调用构造函数时,构造函数只处理它正在创建的对象,事实上它是递归地(基于x中的数据)处理的,这是有点不同的。在这种情况下,类被大量绑定到树中,如果不构建树,就无法轻松地构造。是的,这是可能的(来自注释),但确实不可取

如果您有一组要存储的项目(例如树),典型的构建块是

  • -存储在树中的对象
  • 节点
    -了解树以及如何遍历树的对象
  • TreeContainer
    -一个保存树顶部的对象,它知道如何查找存储的
    s
  • Builder
    -通过调用
    TreeContainer

  • 看起来很荒谬,你到底想实现什么?你想实现什么?你可以马上将a和b设置为零:-)我真的不相信你会需要这么奇怪的东西。这应该是一个XY问题。为什么?为什么不直接设置
    a=--k;
    ?为什么要发明这种不存在的语法?@iouvxz而不是覆盖
    *this
    您可能希望使用
    新建kdtree(…)
    设置
    this->left
    this->right
    “您不能使用构造函数来构建一组对象。”我认为这个说法很容易反驳;-)。从更严重的角度来看,我不明白为什么不可能构建一些实际的东西,比如说,一个节点ctor创建一个完整的树,调用自己几次,并将创建的节点的地址分配给正确的分支指针。这可能就是OP试图实现。我还认为,如果必须的话,您可以将所有这些角色合并到一个节点类中;您所做的区分是逻辑性的,而不是语言强加的。
    class Class
    {
        Class * left;
        Class * right;
        Class(  SomeObject & x )
        {
             eatSomeData( x );
             left = nullptr;
             right = nullptr;
             if (x->buildleft() )
                 left = new Class( x );
             if (x->buildright() )
                 right = new Class( x );
        }
    };