首页 新闻 会员 周边 捐助

一个c++构造函数的问题

0
悬赏园豆:20 [已解决问题] 解决于 2013-10-17 19:04
#include <iostream>
#include <string>
using namespace std;

class TreeNode
{
public:
    TreeNode():count(0),left(0),right(0){cout<<"TreeNode()"<<endl;}
    //此处将构造left、right的初始化放在初始化列表中(即:left(new TreeNode(*lef),right(new TreeNode(*rig))为什么编译无法通过???
    TreeNode(const string val,const int cnt,const TreeNode *lef,const TreeNode *rig):value(val),count(cnt)
{
    left=new TreeNode(*lef);
    right=new TreeNode(*rig);
    cout<<"TreeNode(,,,)"<<endl;
}
    TreeNode(const TreeNode& org);
    ~TreeNode();
    string getValue(){return value;}
private:
    string value;
    int count;
    TreeNode *left;
    TreeNode *right;
};

TreeNode::TreeNode(const TreeNode& org)
{
    cout<<"TreeNode(const TreeNode& org)"<<endl;
    count=org.count;
    if (org.left)
    {
        left=new TreeNode(*org.left);
    }
    else
        left=0;
    if (org.right)
    {
        right=new TreeNode(*org.right);
    }
    else 
        right=0;

}

TreeNode::~TreeNode()
{
    cout<<"~TreeNode"<<endl;
    if (left)
    {
        delete left;
    }
    if(right)
    {
        delete right;
    }
}

int main()
{
    TreeNode tn;
    TreeNode left;
    TreeNode right;
    TreeNode root("root",1,&left,&right);
}

问题如注释,求大神解答~~~~~~

leowww的主页 leowww | 初学一级 | 园豆:127
提问于:2013-10-16 17:39
< >
分享
最佳答案
0

为什么不能放在初始化列表中? 我试了下是能编译过的。

class TreeNode
{
public:
    TreeNode(const string val, const int cnt, const TreeNode *lef, const TreeNode *rig) 
        : value(val), count(cnt), left(new TreeNode(*lef)), right(new TreeNode(*rig))
    {
        cout << "TreeNode(,,,)" << endl;
    }

    TreeNode(const TreeNode& org);
    ~TreeNode();

private:
    string value;
    int count;
    TreeNode *left;
    TreeNode *right;
};

 

收获园豆:10
天方 | 大侠五级 |园豆:5432 | 2013-10-16 21:56
其他回答(1)
0

left(new TreeNode(*lef),right(new TreeNode(*rig)) //拷贝你的代码

left(new   //我写的代码

你不觉得你的括号有问题吗?比我的括号宽了点吗?

 

另外一点,在初始化列表里面调用new是相当糟糕的做法。因为new是会抛出异常的。就以你的为例,假如right(new TreeNode(*rig))抛出了异常,因为构造函数还没有被调用,自然就不会调用析构函数,这个时候left就造成了内存泄露了。

收获园豆:10
嗷嗷 | 园豆:757 (小虾三级) | 2013-10-16 23:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册