【问题标题】:Is it possible to access the current 'to create' obj in constructor?是否可以在构造函数中访问当前的“创建”obj?
【发布时间】:2015-06-04 15:47:01
【问题描述】:

我目前正在编写一个树类,想实现一个构造函数来创建具有一定维度和深度的树:

public:
    tree();                           // empty constructor
    tree(int dimension, int depth);   // constructing an empty tree
    // ...
    void            newNode(node<T>* const&, T const&);
    // ...
  private:
    unsigned int mNumNodes;
    node<T>      *mRoot;


template<typename T>
tree<T>::tree(int dimension, int depth):
  // member vars
{
  // other constructing stuff
  this->newNode(0, parent);
}

显然这样的事情是不可能的,但是当我编写了一个很好的工作函数来将新节点添加到具有特定值的特定父节点时,使用它会很好。

但是:此方法需要访问当前对象。

也许有某种解决方案对我有用,既不能指向 obj,也不能使用任何其他类型的访问。

【问题讨论】:

  • 为什么不this-&gt;newNode(mRoot, parent);
  • 请提供SSCCE
  • 因为树没有被构造成一个指针并且有:no matching function for call to ‘tree&lt;std::basic_string&lt;char&gt; &gt;::newNode(int, node&lt;std::basic_string&lt;char&gt; &gt;*&amp;)’
  • @NathanOliver 为此我必须粘贴一个 80 行长的节点标题。
  • @hGen - Re 因为树不被构造为指针 - 如果你的意思是this 指针,它肯定是。

标签: c++ object constructor


【解决方案1】:

问题不在于构造函数。在执行进入构造函数的主体时,对象被构造为tree&lt;std::basic_string&lt;char&gt; &gt;。这意味着您可以在构造函数的主体中将该对象用作该类的实例。

在构造函数中使用这样的对象的问题是,正在构造的实际对象是否是手头类的派生类。这是父类的构造函数中还不存在的知识。最好不要在构造函数中调用虚函数。从构造函数中调用非虚拟成员函数通常是可以的。另一个问题是派生类的构造函数可能会改变父类中的内容。

这不是这里发生的事情。这里的问题是使用零作为node&lt;T&gt;* const&amp;。这行不通,期间。如果它确实有效,您可以更改零的值。

根据您发布的不完整代码,去掉 newNode 的第一个参数声明中的 & 号就可以了。

【讨论】:

  • 嗯,是的,实际上问题是我在创建新节点时默认使用0 初始化了节点的数据,所以我尝试用 0 填充 std::string。跨度>
猜你喜欢
  • 2021-04-25
  • 2020-03-08
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
相关资源
最近更新 更多