鱼C论坛

 找回密码
 立即注册
查看: 1222|回复: 5

[已解决]构造函数执行完后,成员变量的赋值消失了?!

[复制链接]
发表于 2020-11-19 01:13:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//vector.h

#ifndef _VECTOR_H_
#define _VECTOR_H_

#include<iostream>
using namespace std;

typedef int Rank;
#define DEFAULT_CAPACITY 10

class Vector
{
private:
        int *p,*elem;//p指向数组elem,用于释放数组
        int _capacity;//_capacity是数组容量
        void swap(int &i,int &j);//交换
        bool bubble(Rank lo,Rank hi);//一趟扫描交换

public:
        Rank _size;//_size是实际规模
        void expand();//空间不足时扩容
        void shrink();//缩容
        Rank insert(Rank r,int const & e);//插入
        int remove(Rank lo,Rank hi);//删除区间[lo,hi]
        void unsort(Rank lo,Rank hi);//随机打乱原有向量顺序  
        Rank find(int const& e,Rank lo,Rank hi)const;//无序向量的顺序查找:返回最后一个元素e的位置;失败时,返回lo-1
        void traverse();//遍历
        void bubbleSort(Rank lo,Rank hi);//冒泡排序法
        void print();

        //构造函数
        Vector(int _capacity=DEFAULT_CAPACITY,int scale=7);//c是数组容量,scale是实际规模

       
        ~Vector()//析构函数,释放elem数组
        {
                cout << "已释放" << _capacity << "个单位的数组" << endl;
                delete [] p;
        }
};

#endif
最佳答案
2020-11-19 07:41:17
本帖最后由 xieglt 于 2020-11-19 07:45 编辑
class Vector
{
private:
        int *p,*elem;//p指向数组elem,用于释放数组
        int _capacity;//_capacity是数组容量
}

Vector::Vector(int _capacity,int scale);
成员变量和构造函数的参数用的一个名字。编译器怎么区分呢?
实际上,编译器使用的是参数,你的成员变量没赋值,当然是一个乱数字啦。

扩容函数也有一个问题。没有给 p 赋值,
p还是指向 oldelem。如果在其他函数里用到p,肯定会出错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-19 01:14:25 | 显示全部楼层
//main.cpp

#include "vector.h"
#include <iostream>
using namespace std;

int main()
{
        Vector v1;

        v1.expand();//空间不足时扩容

        cout << v1._capacity << endl;
       
        v1.find('e',0,v1._size);//无序向量的顺序查找:返回最后一个元素e的位置;失败时,返回lo-1
        v1.traverse();//遍历
        v1.bubbleSort(0,v1._size);//冒泡排序法

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-19 01:15:12 | 显示全部楼层
//vector.cpp

#include "vector.h"
#include <iostream>

using namespace std;

Vector::Vector(int _capacity,int scale)
{
        cout << "请输入向量的容量:";
        cin >> _capacity;
        cout << "请输入向量的实际规模:";
        cin >> scale;
        elem = new int[_capacity];//建立容量为_capacity的数组
        cout << "请输入向量的元素(用回车隔开):";
        for(_size = 0;_size < scale;cin >> elem[_size++])        //给数组中的前scale个赋值       
        p = elem;
        cout << "已创建" << _capacity << "个单位的数组" << endl;
}

void Vector::expand()//空间不足时扩容
{
        if(_size < _capacity)//尚未满员时,不必扩容
                return;       
        int * oldElem = elem;
        elem = new int[_capacity <<= 1];//容量加倍
//        cout << _capacity << endl;
        for(int i= 0;i < _size;i++)
                elem[i] = oldElem[i];//复制原向量内容
        delete []oldElem;//释放原空间
        cout << "该向量扩容后容量为:" << _capacity << endl;
        print();
}

//后面的其他函数就不放了,无关紧要
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-19 01:18:33 | 显示全部楼层
通过断点调试,我发现,在执行构造函数的最后一句输出_capacity的时候,还是正常的,即我输入的值。但当构造函数结束了,在main里执行下一步时,_capacity变成了一个垃圾值(-1717986920),导致后面的扩容出错。
请问大佬们,怎么会这样……_capacity明明是成员函数啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-19 07:41:17 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-11-19 07:45 编辑
class Vector
{
private:
        int *p,*elem;//p指向数组elem,用于释放数组
        int _capacity;//_capacity是数组容量
}

Vector::Vector(int _capacity,int scale);
成员变量和构造函数的参数用的一个名字。编译器怎么区分呢?
实际上,编译器使用的是参数,你的成员变量没赋值,当然是一个乱数字啦。

扩容函数也有一个问题。没有给 p 赋值,
p还是指向 oldelem。如果在其他函数里用到p,肯定会出错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-11-19 10:29:39 | 显示全部楼层
xieglt 发表于 2020-11-19 07:41
成员变量和构造函数的参数用的一个名字。编译器怎么区分呢?
实际上,编译器使用的是参数,你的成员变量 ...

感谢你!我以为在类里函数使用成员变量是默认的……解决了!
不过p指针我指向的是elem数组?特地设置p指针是为了析构函数里delete [] p;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 13:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表