如何从课堂上返回char *?

时间:2016-02-23 08:44:13

标签: c++ class

我想返回一个名字,虽然main应该能够改变它(在main的范围内),但它不应该在类中改变。

如果我这样做:

Quick-Documentation

我在某个时候需要char* get_name(){ char* name = new char[sizeof(_name)+1]; strcpy(_name,name); return name; } 吗?什么时候?

编辑:我不相信它与pointer to local variable的问题相同,因为这里的问题是如何删除它 后我使用它。

4 个答案:

答案 0 :(得分:6)

嗯,这就是手动内存管理的问题。实际上,如果你想要复制一份副本,那么调用者就有责任释放内存,这非常容易出错。这就是为什么C ++有std :: string类来处理内存的原因;

   
 function calculate() {
		var myBox1 = document.getElementById('qty').value;	
		var myBox2 = document.getElementById('rate').value;
		var amnt = document.getElementById('amnt');	
		var myResult = myBox1 * myBox2;
		amnt.value = myResult;
      }
		
  var count = "1";
  function addRow(in_tbl_name)
  {
    var tbody = document.getElementById(in_tbl_name).getElementsByTagName("TBODY")[0];
    // create row
    var row = document.createElement("TR");
    // create table cell 1
    var td1 = document.createElement("TD")
    var strHtml1 = "<INPUT TYPE=\"text\" NAME=\"r_name\" SIZE=\"30\">";
  
   
    td1.innerHTML = strHtml1.replace(/!count!/g,count);
    // create table cell 2
    var td2 = document.createElement("TD")
    var strHtml2 = "<INPUT TYPE=\"text\" NAME=\"r_desc\" PLACEHOLDER=\"description\" SIZE=\"30\">";
    td2.innerHTML = strHtml2.replace(/!count!/g,count);
    // create table cell 3
    var td3 = document.createElement("TD")
    var strHtml3 = "<INPUT TYPE=\"text\" NAME=\"r_qty\" PLACEHOLDER=\"QTY\" ID=\"qty\" ONINPUT=\"calculate()\" SIZE=\"30\">";
    td3.innerHTML = strHtml3.replace(/!count!/g,count);
    // create table cell 4
    var td4 = document.createElement("TD")
    var strHtml4 = "<INPUT TYPE=\"text\" NAME=\"r_RATE\" PLACEHOLDER=\"rate\" ID=\"rate\" ONINPUT=\"calculate()\" SIZE=\"30\">";
    td4.innerHTML = strHtml4.replace(/!count!/g,count);
    // create table cell 5
    var td5 = document.createElement("TD")
    var strHtml5 = "<INPUT TYPE=\"text\" NAME=\"r_total\" PLACEHOLDER=\"amount\" ID=\"amnt\" >";
	
    td5.innerHTML = strHtml5.replace(/!count!/g,count);
	 // create table cell 4
    var td6 = document.createElement("TD")
    var strHtml6 = "<INPUT TYPE=\"Button\" CLASS=\"Button\" onClick=\"delRow()\" VALUE=\"Delete Row\">";
	
    td6.innerHTML = strHtml6.replace(/!count!/g,count);
	
    // append data to row
    row.appendChild(td1);
    row.appendChild(td2);
    row.appendChild(td3);
    row.appendChild(td4);
    row.appendChild(td5);
	row.appendChild(td6);
    // add to count variable
    count = parseInt(count) + 1;
    // append row to table
    tbody.appendChild(row);
  }
  function delRow()
  {
    var current = window.event.srcElement;
    //here we will delete the line
    while ( (current = current.parentElement)  && current.tagName !="TR");
         current.parentElement.removeChild(current);
  }
 

答案 1 :(得分:1)

在某些时候你确实必须delete[]返回指针:因为每个new[]必须与delete[]平衡。这可能很难管理。

但为什么不在班级中维护std::string成员,然后写

const std::string& getName() const
{
    return name; // name is the class member.
}

代替?返回const引用会避免使用深层副本,也意味着调用者无法修改该成员。

答案 2 :(得分:1)

首先,我认为你的意思是

strcpy( name, _name );
        ^^^^^^^^^^^

而不是

strcpy( _name, name );
        ^^^^^^^^^^^ 

返回指向动态分配的内存的指针的类的对象在返回指针后将无法访问此内存。

因此,该函数的客户端将释放已分配的内存。

正如其他人已经指出的那样,在这种情况下使用标准类std::string会更好。

答案 3 :(得分:1)

正如其他人所说,使用std :: string可能是更好的选择。如果你想使用char *,我建议只返回一个const char *:

const char* get_name() {
    return _name;
}

您将返回一个const引用,这意味着调用代码不应该更改它。你这样做的方式,你每次调用get_name()之后都必须删除它,这是不理想的。