繁体   English   中英

为什么这个 class 返回长度 33 而这不是不正确的?

[英]Why does this class return length 33 while that is not is not true?

目前我正在学习类和构造函数。 昨天我上传了几乎相同的代码,但有一个不同的问题。 我需要了解有关委派的一些信息。

在我的代码中,发生了 2 件非常奇怪的事情。 在主块中,我创建了 object x,它是容器 class 的一部分。 当我尝试 output 时,我得到的长度为输出 33,这当然不是真的或至少不是有意的。

也许我应该为此开始另一篇文章,但它可能高度相关。 我还主要写了:

Container x1 = x;
std::cout << x1.GetData()[2] << std::endl;
std::cout << x1.GetLenght() << std::endl;

我试图将 x 复制到 x1。 当我 do.GetData() 它显示非常小的值(我认为机器错误),因此这表明复制失败,但是当我尝试获取长度时,初始错误 output 为 33。

这可能有点混乱,但由于covid,我无法询问课程讲师。 任何要考虑的反馈或材料将不胜感激。

问题:

  • 为什么我得到 output object x(和间接 x1)的长度为 33?

  • 为什么 deepcopy 无法复制元素?

    代码:

Class:

class Container
{
public: //[DO NOT MODIFY/REMOVE THESE GETTERS AND SETTERS: THEY ARE USED IN THE SPECTEST]
int GetLength() const {return length;}
double* GetData() const {return data;}
void SetLength(const int length) {this->length = length;}
void SetData(double* data) {this->data = data;}

public:
    // constructors
    Container(){
        length = 0;
        data = nullptr;
    }

Container(int len){
    int length = len;
    data = new double[length];
}

Container(std::initializer_list<double> il): Container(il.size())
{
    std::copy(il.begin(), il.end(), data);
}

Container(const Container& other) : Container(other.length)
{
    for (auto i=0; i<other.length; i++){
        data[i] = other.data[i];
    }
}




// destructor
  ~Container()
   {
       delete[] data;
       length = 0;
       }
 


// operators
void print(const std::string& info) const
{
    // print the address of this instance, the attributes `length` and
    // `data` and the `info` string
    std::cout << "  " << this << " " << length << " " << data << "  "
        << info << std::endl;
}

private:
    int length;
    double* data;
};

主要的:

int main()
{
    Container x({1,2,4,5});
    std::cout << "x has address " << &x << std::endl;

    Container x1 = x;

    std::cout << x1.GetData()[2] << std::endl;
    
    return 0;
}

int length = len; 不修改成员,但创建一个局部变量。 它应该是:

length = len;

或者更好,使用初始化列表:

Container(int len) :
    length{len}, 
    data{new double[length]}
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM