请大家帮我看下我写的Int型的一维数据结构

sxjkk 2011-06-10 09:28:10
因为事先不知道有多少个INT型元素,所以不能用简单的数组,必须用动态的

所以写了一个指向指针的一个INT型的数据结构,请大家看下

UIntArray.h


#pragma once

#define Default_Length 20

class UIntArray
{
public:
UIntArray(int length);
UIntArray();
~UIntArray(void);
void AddInt(int value);
int *GetInt(int index);
void SetArrayLength(int length);
int GetLength();
void RemoveAll();
private:
int i_length;
int p_count;
int **IntArray;
};



UIntArray.cpp


#include "StdAfx.h"
#include "UIntArray.h"

UIntArray::UIntArray(int length)
{
IntArray = (int **)malloc(length * sizeof(int *));
i_length = length;
p_count = 0;
}

UIntArray::UIntArray()
{
IntArray = NULL;
i_length = 0;
p_count = 0;
}

UIntArray::~UIntArray(void)
{
int i = 0;
//for(i = 0;i < i_length;i++)
//{
// if(IntArray[i] != NULL)
// {
// free(IntArray[i]);
// IntArray[i] = NULL;
// }
//
//}
if(IntArray != NULL)
{
free(IntArray);
IntArray = NULL;
}
}

void UIntArray::AddInt(int value)
{
if(i_length == 0 || IntArray == NULL)
return;

if(value != NULL && p_count < i_length)
{
IntArray[p_count] = &value;
printf("%d\n", *IntArray[p_count]);
p_count++;
}


}

int *UIntArray::GetInt(int index)
{
if(i_length == 0 || IntArray == NULL)
return NULL;

if(index < i_length)
{
return IntArray[index];
}
return NULL;
}

void UIntArray::SetArrayLength(int length)
{
IntArray = (int **)malloc(length * sizeof(int *));
i_length = length;
}

int UIntArray::GetLength()
{
return i_length;
}

void UIntArray::RemoveAll()
{
p_count = 0;

if(IntArray != NULL)
{
free(IntArray);
IntArray = NULL;
}
}


测试代码

UIntArray *intArray = new UIntArray();
intArray->SetArrayLength(3);

intArray->AddInt(1);
intArray->AddInt(2);
intArray->AddInt(3);

//for(int i = 0;i < intArray->GetLength();i++)
// printf("%d\t", intArray->GetInt(i));
printf("%d\n", *intArray->GetInt(3));

intArray->RemoveAll();

intArray->SetArrayLength(3);
intArray->AddInt(4);
intArray->AddInt(5);
intArray->AddInt(6);

for(int i = 0;i < intArray->GetLength();i++)
printf("%d\t", intArray->GetInt(i));

delete intArray;


但是输出结果却不正确,正确的是 1 2 3,但是为什么输出却是0 1 2

请大家帮我看看这是为什么

我用的是VC2008的开发环境
...全文
76 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-06-10
  • 打赏
  • 举报
回复
void UIntArray::SetArrayLength(int length)
{
IntArray = (int **)malloc(length * sizeof(int *));
i_length = length;
}


malloc前也不把原有的free掉?

    if(IntArray != NULL)
{
free(IntArray);
IntArray = NULL;
}

free(NULL)是没问题的,free函数自身就会检测是不是NULL。


说实话这类封装的太差了,SetArrayLength前,一定要RemoveAll,不然内存泄漏。而且不能在任意位置添加元素。只能一个个按次序添加,加完了,改都没法改
练练手,自己写是好事,但请先看下vector是怎么实现的
就想叫yoko 2011-06-10
  • 打赏
  • 举报
回复
自己写可以当做练习
说到可控的话 stl的比你写健壮多了
另外vector是模板写的
你的只能支持int
sxjkk 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ao929929fei 的回复:]
先解释一下问什么要用二维指针啊
int **IntArray;用一维就可以了
再看看这个地方
IntArray[p_count] = &value;
一个指针等于临时变量的地址,哥们,我只是无话可说了
[/Quote]

int *p;
int value = 3;
p = &value;

我就是根据这个写的啊,有什么问题?
sxjkk 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ouyh12345 的回复:]
为什么不用vector?
[/Quote]

自己写的感觉要可控些

如果自己写的不够用再考虑STL
newfarmerchi 2011-06-10
  • 打赏
  • 举报
回复

/*在main中先定义6个变量,
AddInt(int value)应该引用,变为AddInt(int &value)
否则只是个copy。
int *GetInt(int index),变为GetInt(int index)
返回一个值。*/

#include <stdlib.h>
#include <stdio.h>
#pragma once

#define Default_Length 20

class UIntArray
{
public:
UIntArray(int length);
UIntArray();
~UIntArray(void);
void AddInt(int &value);//<------------------------引用
int GetInt(int index);//<--------------------------返回一个值
void SetArrayLength(int length);
int GetLength();
void RemoveAll();
private:
int i_length;
int p_count;
int **IntArray;
};



UIntArray::UIntArray(int length)
{
IntArray = (int **)malloc(length * sizeof(int *));
i_length = length;
p_count = 0;
}

UIntArray::UIntArray()
{
IntArray = NULL;
i_length = 0;
p_count = 0;
}

UIntArray::~UIntArray(void)
{
int i = 0;
//for(i = 0;i < i_length;i++)
//{
// if(IntArray[i] != NULL)
// {
// free(IntArray[i]);
// IntArray[i] = NULL;
// }
//
//}
if(IntArray != NULL)
{
free(IntArray);
IntArray = NULL;
}
}

void UIntArray::AddInt(int &value)//<------------------------引用
{
if(i_length == 0 || IntArray == NULL)
return;

if(value != NULL && p_count < i_length)
{
IntArray[p_count] = &value;
printf("%d\n", *IntArray[p_count]);
p_count++;
}


}

int UIntArray::GetInt(int index)
{
if(i_length == 0 || IntArray == NULL)
return 0;

if(index < i_length)
{
return *IntArray[index];//<-----返回值
}
return 0;
}

void UIntArray::SetArrayLength(int length)
{
IntArray = (int **)malloc(length * sizeof(int *));
i_length = length;
}

int UIntArray::GetLength()
{
return i_length;
}

void UIntArray::RemoveAll()
{
p_count = 0;

if(IntArray != NULL)
{
free(IntArray);
IntArray = NULL;
}
}
int main()
{

UIntArray *intArray = new UIntArray();
intArray->SetArrayLength(3);
int a=1, b=2, c=3, d=4, e=5, f=6;//<----------定义
intArray->AddInt(a);//带入
intArray->AddInt(b);
intArray->AddInt(c);

for(int i = 0;i < intArray->GetLength();i++)
printf("%d\t", intArray->GetInt(i));
printf("%d\n", intArray->GetInt(3));

intArray->RemoveAll();

intArray->SetArrayLength(3);
intArray->AddInt(d);
intArray->AddInt(e);
intArray->AddInt(f);

for( i = 0;i < intArray->GetLength();i++)//vc6里 i 是重复定义
printf("%d\t", intArray->GetInt(i));

delete intArray;
return 0;

}


luciferisnotsatan 2011-06-10
  • 打赏
  • 举报
回复
难道lz不知道有 stl 这么好的东西?
luciferisnotsatan 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ouyh12345 的回复:]

为什么不用vector?
[/Quote]
的确,用的是c++,为何不用vector?
ao929929fei 2011-06-10
  • 打赏
  • 举报
回复
先解释一下问什么要用二维指针啊
int **IntArray;用一维就可以了
再看看这个地方
IntArray[p_count] = &value;
一个指针等于临时变量的地址,哥们,我只是无话可说了
ouyh12345 2011-06-10
  • 打赏
  • 举报
回复
为什么不用vector?
bdmh 2011-06-10
  • 打赏
  • 举报
回复
先把你的错误隐患改掉把
printf("%d\n", *intArray->GetInt(3));这个GetInt返回NULL,报错
sxjkk 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 newfarmerchi 的回复:]
C/C++ code

/*在main中先定义6个变量,
AddInt(int value)应该引用,变为AddInt(int &value)
否则只是个copy。
int *GetInt(int index),变为GetInt(int index)
返回一个值。*/

#include <stdlib.h>
#include <stdio.h>
#pragma onc……
[/Quote]

感谢这位同学帮我完善了不足的地方,现在代码能正常跑了
sxjkk 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 luciferisnotsatan 的回复:]
C/C++ code
void UIntArray::SetArrayLength(int length)
{
IntArray = (int **)malloc(length * sizeof(int *));
i_length = length;
}


malloc前也不把原有的free掉?


C/C++ code
if(IntArray !……
[/Quote]

谢谢提出意见,这个类还有很多地方需要完善

我写这个类的目的不是要接近vector的完美(那直接用vector算了),而是自己写的,想要什么功能都可以通过手段实现。STL模板中的一些数据结构类提供的API并不能满足自己的需求,只要不是太复杂的,自己写的话出了问题好定位

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧