【问题标题】:C++ Basic template class constructorC++ 基本模板类构造函数
【发布时间】:2015-04-21 15:05:13
【问题描述】:

我对关于 BSTNode 类的数据成员的对象创建感到困惑。例如,在头文件中,数据成员之一被定义为“Key k”。这是否意味着已经创建了默认密钥,我不需要在默认的 BSTNode 构造函数中编写任何内容,还是我仍然需要编写 Key k;在构造函数中创建默认键?当我在构造函数中传递一个 Key 设置为 k 时,这仍然成立吗?

类定义(在标题中):

 class BSTNode {
 public:
   BSTNode();
   BSTNode(Key k, Value v);

   Key k;
   Value v;
   BSTNode* left;
   BSTNode* right;
};

这是我的尝试:

template <class Key, class Value>
BSTNode<Key,Value>::BSTNode(){
    Key kk; //create th default key
    k = kk; //set the BSTNode's k to the default key
    Value vv; //create the default value
    v = vv; //set the BSTNode's v to the default value
    BSTNode* left = NULL; //set left pointer to NULL
    BSTNode* right = NULL; //set right pointer to NULL
 }

【问题讨论】:

  • 可能Key 是非模板版本中的实际具体类。在模板化版本中,Key 是传入类型的占位符名称。通常人们使用通用的TU 以避免名称与具体类型发生冲突。
  • 你的构造函数没有做任何事情。最好先阅读一些C++ books
  • @Andyg 当我编写 BST 的具体实现时,密钥只是一个 int
  • 大部分(如果不是全部)问题与模板无关。在转向模板之前,也许您应该从更基本的示例开始。
  • 据我所知,BSTNode* left = NULL; //set left pointer to NULL 行根本没有明显的效果。即使它是BSTNode* left = new BSTNode();,它也只是一个隐藏成员变量的局部变量。不管它是不是模板,这都是真的。

标签: c++ templates constructor


【解决方案1】:

您的构造函数基本上是无操作的。

让我们遍历每一行:

template <class Key, class Value>
BSTNode<Key,Value>::BSTNode(){
    Key k;     // <--- local variable, destroyed on return
    Value v;   // <--- local variable, destroyed on return
    BSTNode* left = NULL;  // <--- local variable initialized to NULL, destroyed on return
    BSTNode* right = NULL; // <--- local variable initialized to NULL, destroyed on return
}

您不是在初始化类成员变量——您所做的是创建全新的本地变量,并将它们设置为一个值。一旦构造函数完成,那些局部变量就不再存在了。

你想做的是这样的:

class BSTNode {
 public:
   BSTNode();
   BSTNode(Key theKey, Value theValue) : 
   Key m_key;
   Value m_value;
   BSTNode* m_left;
   BSTNode* m_right;
};

 template <class Key, class Value>
    BSTNode<Key,Value>::BSTNode() : 
            m_key(Key()), m_value(Value()), m_left(0), m_right(0) {}

 template <class Key, class Value>
     BSTNode(Key theKey, Value theValue) : m_key(theKey), m_value(theValue), m_left(0), m_right(0) 
     {
        //...
     }

请注意,构造函数的 0 参数版本将键和值初始化为 KeyValue 类型的默认初始值。

【讨论】:

  • 您查看的版本与我所说的不同。无论哪种方式,感谢您提供实际答案。在我谈论的版本中,我有 Key kk;\n k = kk\n Value vv; \n 值 = v;\n 左 = NULL;对 = NULL;
  • 嗯,您的最新版本与答案中描述的问题相同。您正在创建局部变量并使用它们而不是实际的成员变量。
  • k 是实际的成员变量,我将 k 设置为我创建的局部变量。我不知道您可以仅使用 Key() 调用默认构造函数。这绝对是一种更好的方法。他们在迈阿密教授 C++ 的方式是在数据结构课程开始时只花 3 周时间在上面,实际上在那段时间里很难了解很多关于它的事情。我们对java了解很多,但是在我有限的知识范围内,java中的对象创建有点不同。
  • Key() 将创建一个类型为Key 的临时默认对象,然后将m_key 初始化为此值(或使用单字母变量k)。所以如果Keyintint的默认值为0,如果是std::string,那么Key()将产生一个空字符串,等等。
猜你喜欢
  • 1970-01-01
  • 2017-08-27
  • 2017-09-12
  • 2020-01-16
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
相关资源
最近更新 更多