0

我正在尝试编写一个具有一些功能的模板/类,但我遇到了一个看起来相当新手的问题。我有一个简单的插入函数和一个显示值函数,但是每当我尝试显示值时,我总是收到看起来像内存地址的东西(但我不知道),但我想接收存储的值(在这个特别的例子,int 2)。我不确定如何将其取消引用为一个值,或者我是否完全搞砸了。我知道向量是一个更好的选择,但是我需要在这个实现中使用一个数组——老实说,我想对代码和正在发生的事情有更透彻的理解。任何有关如何完成此任务的帮助将不胜感激。

示例输出(每次都以相同的方式运行程序):003358C0

001A58C0

007158C0

代码:

#include <iostream>
using namespace std;

template <typename Comparable>
class Collection
{
public: Collection() {
    currentSize = 0;
    count = 0;
    }
    Comparable * values;
    int currentSize; // internal counter for the number of elements stored
    void insert(Comparable value) {
        currentSize++; 
                // temparray below is used as a way to increase the size of the 
                // values array each time the insert function is called
        Comparable * temparray = new Comparable[currentSize];
        memcpy(temparray,values,sizeof values);

                // Not sure if the commented section below is necessary, 
                // but either way it doesn't run the way I intended

        temparray[currentSize/* * (sizeof Comparable) */] = value; 
        values = temparray;
    }
    void displayValues() {
        for (int i = 0; i < currentSize; i++) {
            cout << values[i] << endl;
        }
    }
};

int main()
{
Collection<int> test;
int inserter = 2;
test.insert(inserter);
test.displayValues();
cin.get();
    return 0;
}
4

3 回答 3

2

这一行是错误的:

memcpy(temparray,values,sizeof values);

第一次运行此行时,values指针未初始化,因此将导致未定义的行为。此外,使用sizeof values是错误的,因为它总是会给出指针的大小。

另一个问题:

temparray[currentSize] = value; 

这也将导致未定义的行为,因为您只在 中分配currentSize了项目temparray,因此您只能0访问currentSize-1.

于 2012-09-10T14:59:26.473 回答
2

好吧,如果你坚持,你可以编写和调试你自己的有限版本的std::vector.

首先,不要memcpy来自未初始化的指针。在构造函数中设置valuesnew Comparable[0]

二、memcpy正确的字节数:(currentSize-1)*sizeof(Comparable).

第三,完全不要memcpy。这假设Comparable类型都可以逐字节复制,这在 C++ 中是一个严重的限制。反而:

编辑:更改uninitialized_copycopy

std::copy(values, values + currentSize - 1, temparray);

第四,在不再使用时删除旧数组:

delete [] values;

第五,除非代码很少插入,否则将数组扩展不止一个。std::vector通常将其大小增加 1.5 倍。

currentSize第六,在大小改变之前不要增加。这会将所有这些currentSize-1s 更改为currentSize,这将不那么烦人。<g>

第七,一个大小数组的N索引从0N-1,所以新数组的顶部元素在currentSize - 1,而不是currentSize

第八,我有没有提到,你真的应该使用std::vector.

于 2012-09-10T15:30:26.813 回答
0

您的阵列访问也有错误。

temparray[currentSize/* * (sizeof Comparable) */] = value;

请记住,数组从索引零开始。因此,对于长度为 1 的数组,您可以设置 temparray[0] = value。由于您在插入函数的顶部增加 currentSize,因此您需要这样做:

temparray[currentSize-1] = value;
于 2012-09-10T15:03:21.730 回答