【发布时间】:2014-02-02 20:09:13
【问题描述】:
免责声明:我对 C++ 非常非常陌生。两年前我上了一门课,现在我正在上另一门课,所以试图恢复这种心态是很困难的。话虽如此,我知道我的代码非常糟糕。我需要帮助和建设性的批评,所以请避免直接抨击,因为我知道我真的不知道自己在做什么。
目标:我正在编写一个程序,它接收两个 {1 2 3}(任意大小)形式的用户输入集,并对它们执行一些操作。但是我无法简单地读入它们。这是头文件的快速 sn-p,它显示了我将要询问的功能:
class Set{
public:
Set(); //Constructor for empty set.
Set(int element); //Constructor for set of one element
~Set();
unsigned int getSize() const;
int operator[](const int e) const;
friend ostream& operator<<(ostream& oss, const Set& output);
friend istream& operator>>(istream& ss, Set& target);
private:
int size;
int *elements[];
void resize(unsigned int new_size);
};
还有更多,但我只是向您展示所有必要的东西。
对于赋值,我们创建了一个名为 Set 的类,但该集合必须存储为一个数组。每个 Set 都有一个指针数组(即 Set 类带有 int *elements[])。我们需要重载“>>”运算符以将用户输入转换为 Set。用户输入两个集。我们假设用户足够聪明,可以以精确的形式 {1 2 3 4} 输入它,但它可以是任何大小。这是我的重载>>。
istream& operator>>(istream& ss, Set& target){
//The constructor Set target; creates an empty Set with array size=0.
char c;
if (ss.peek()=='}') ss >> c;
if (ss.peek()==EOF) ss >> c;
ss >> c; //First we read in the '{' character.
int num;
while (ss.peek()!='}'){
ss >> num;
target.resize(target.getSize()+1);
*target.elements[target.getSize()-1]=num;
};
return ss;
};
getSize() 只是一个返回值“size”的函数。上述 sn-p 的目标是创建一个空 Set,然后对于“{”和“}”之间的每个 int,我们将数组大小调整 1,然后将该 int 放入数组的下一个元素中。此外,流对我来说仍然像指针一样抽象,所以这就是为什么这看起来有点暴力。
问题我遇到的是调整大小。我想要 - 显然 - 调整大小以更改大小,但它不允许这样做。我想要完成的是调整大小以更改被调用的 Set 的 *elements 指针以指向具有 new_size 个元素的新数组。然后我想释放该指针以避免内存泄漏。
void Set::resize(unsigned int new_size){
if (size!=new_size){
int *newelements = new int[new_size];
for (int i=0; i<new_size || i<size; i++){
newelements[i] = *elements[i];
};
*elements = newelements;
delete newelements;
if (size>new_size) size=new_size;
};
};
我知道有一点是错误的:当我在 ">>" 的定义中调用 newset.resize 时,
newelements[i] = *elements[i];
line 正在尝试分配尚不存在的内容,因为“num”尚未分配给 *newset.elements[i]。但是,如果我尝试在“>>”中切换这些顺序,使其变成这样......
*target.elements[target.getSize()]=num;
target.resize(target.getSize()+1);
...这应该没有意义,因为目标数组的大小是0,所以我不能说target[0]=num;
我知道的另一件事是错误的:我使用指针的方式一定有问题,因为如果我尝试在调整大小定义中说 size=new_size ,我收到“EXC_BAD_ACCESS”错误。实际上,如果我按原样运行,我会收到相同的错误消息。
此外,在作业中,我们被告知“仅当 new_size 严格小于 size 时,才应调整大小。”我不明白这怎么可能奏效。如果我们必须从一个 size=0 的初始化数组开始,那么我们怎样才能让它更大呢?
我希望我已经包含了足够多的内容,以便在这方面获得一些帮助。我很感激任何能帮助我理解指针以及如何使用它们的东西。非常感谢!
【问题讨论】:
标签: c++ pointers memory-management exc-bad-access dynamic-arrays