标题:【小白求助】关于动态数组类的两个问题
只看楼主
编程小白DIO
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2020-3-14
结帖率:100%
已结贴  问题点数:20 回复次数:2 
【小白求助】关于动态数组类的两个问题
谢谢您能够点进来!学习C++的时候遇到了关于动态数组类的两个问题
一个是在动态数组类的复制构造函数(/ArrayOfCircle.cpp)里面会出现以下两个提示:
警告    C6385    从“Circles”中读取的数据无效: 可读大小为“(unsigned int)*8+4”个字节,但可能读取了“16”个字节。   
警告    C26444    避免使用具有自定义构造和析构的未命名对象(es.84)。
虽然程序可以运行,但是被复制出来的对象的输出结果是一串随机的数字
第二个是在主函数里面:
        ArrayOfCircle CircleArray(2);
    CircleArray.element(0).SetRadius(2);
    CircleArray.element(1).SetRadius(1);
我创建了一个动态数组,但是里面的两个元素似乎是指向了同一个地址,最后输出两个元素的半径,结果都是1.
并且程序运行后会出现如下的弹窗

下面是代码:
//SimpleCircle.h
#pragma once

class SimpleCircle
{
public:
    SimpleCircle() :Radius(0) {};
    ~SimpleCircle();
    void SetRadius(int R);
    int GetRadius();
    float GetArea();
    SimpleCircle operator=(const SimpleCircle& v);
    void swap(SimpleCircle* a, SimpleCircle* b)
    {
        SimpleCircle *temp1,*temp2;
        temp1 = a;
        temp2 = b;
        a = temp2;
        b = temp1;
    }
private:
    int Radius;
    const float PI = 3.14159f;
};

//SimpleCircle.cpp
#include "SimpleCircle.h"
#include<algorithm>
using namespace std;
SimpleCircle::SimpleCircle() {};
SimpleCircle::~SimpleCircle() {};
void SimpleCircle::SetRadius(int R)
{
   Radius = R;
}
int SimpleCircle::GetRadius()
{
    return Radius;
}
float SimpleCircle::GetArea()
{
    return Radius * Radius * PI;
}
SimpleCircle SimpleCircle::operator=(const SimpleCircle& v)
{
    if (this != &v)
    {
        SimpleCircle C(v);
        swap(&C, this);
        return *this;
    }
    else return *this;
}

//ArrayOfCircle.h
#pragma once
#include"SimpleCircle.h"
#include <cassert>

class ArrayOfCircle
{
public:
    ArrayOfCircle(int sz);
    ArrayOfCircle(const ArrayOfCircle& v);
    ~ArrayOfCircle();
    SimpleCircle& element(int index)
    {
        assert(index >= 0 && index < size);
        return Circles[size];
    }
private:
    int size;
    SimpleCircle* Circles;
};

//ArrayOfCircle.cpp
#include "ArrayOfCircle.h"
#include<iostream>
using namespace std;

ArrayOfCircle::ArrayOfCircle(int sz)
{
    size = sz;
    Circles = new SimpleCircle[size];
}

ArrayOfCircle::ArrayOfCircle(const ArrayOfCircle& v)
{
    size = v.size;
    Circles = new SimpleCircle[size];
    int i= 0 ;
    for ( ; i <size; i++)
        Circles[i] = v.Circles[i];
}

ArrayOfCircle::~ArrayOfCircle()
{
    cout << "Deleting..." << endl;
    delete[] Circles;
}

//源.cpp
#include"SimpleCircle.h"
#include"ArrayOfCircle.h"
#include<iostream>
using namespace std;

int main()
{
    ArrayOfCircle CircleArray(2);
    CircleArray.element(0).SetRadius(2);
    CircleArray.element(1).SetRadius(1);
    ArrayOfCircle CircleArray1(CircleArray);
    cout << CircleArray.element(0).GetRadius() << endl;
    cout << CircleArray.element(1).GetRadius() << endl;
    cout << CircleArray1.element(0).GetRadius() << endl;
    cout << CircleArray1.element(1).GetRadius() << endl;
    return 0;
}

以上。
不知道是哪里出了问题,希望有知道的人能够帮忙解答,谢谢!
搜索更多相关主题的帖子: include return element int size 
2020-04-23 00:30
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
你给出的代码无法编译,你是怎么能运行成功的?
(有两个重复的构造函数  SimpleCircle() :Radius(0) {}; 和 SimpleCircle::SimpleCircle() {})

SimpleCircle::swap 一塌糊涂。而且吧,即使改正确,那 operator= 要调用 swap,swap 内又调用 operator=,属于死递归。
直接改为
SimpleCircle SimpleCircle::operator=(const SimpleCircle& v)
{
    Radius = v.Radius;
    return *this;
}

ArrayOfCircle::element 中 return Circles[size] 应该改为 return Circles[index]

最后,代码必须这么写吗?尤其是那个 ArrayOfCircle,设计得比内置的数组功能差。

2020-04-23 09:03
编程小白DIO
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2020-3-14
得分:0 
回复 2楼 rjsp
感谢!
ArrayOfCircle是老师的题目要求的。
2020-04-23 09:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501203-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016200 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved