为什么这个类返回长度为33,而事实并非如此

  • 本文关键字:并非如此 事实 返回 c++
  • 更新时间 :
  • 英文 :


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

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

也许我应该为此开始另一篇帖子,但它可能具有高度相关性。我还写了主要内容:

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

我试着把x复制到x1。当我执行.GetData((时,它显示的值非常小(我认为是机器错误(,这表明复制失败,但当我尝试获取长度时,最初错误的输出为33。

这可能有点混乱,但由于新冠肺炎,我无法询问课程讲师。如有任何反馈或材料,我们将不胜感激。

问题:

  • 为什么我得到的输出是对象x(和间接x1(的长度是33?

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

    代码:

类别:

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;
};

Main:

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]}
{
}

相关内容

最新更新