在类中创建一个空的动态数组,在访问时给出值?

Posted

技术标签:

【中文标题】在类中创建一个空的动态数组,在访问时给出值?【英文标题】:Creating an empty dynamic array in a class, giving values when accessed? 【发布时间】:2016-09-26 01:14:18 【问题描述】:

只是为了澄清这是我的编程任务的一部分,我知道人们在询问硬件时是多么讨厌,但我很难过,我目前对该主题的理解需要澄清。

我需要创建一个名为 UniqueVector 的类,我必须使用动态数组来创建它(不允许使用向量)。数组中的所有数据都必须是唯一的(没有重复)。现在最初它们都应该从 3 号开始,但里面什么都没有。我相信我是正确的,但我可能是错的。

#include <iostream>
using namespace std;

template<typename T>
class UniqueVector 
public:
    UniqueVector();
    unsigned int capacity();//Returns the size of the space currently allocated for the vector.
    unsigned int size(); //- Returns the current number of elements in the vector.


private:
    T* uniVector;
;

template<typename T>
UniqueVector<T> :: UniqueVector()
    uniVector = new T[3]; // default constructor 
    delete []uniVector;    

template<typename T>
unsigned int UniqueVector<T> :: capacity()

    int uni_size= sizeof(uniVector)/sizeof(uniVector[0]); 
    cout << uni_size << endl; //Gives 1
    return (3); //forcing return size 3 even tho it is wrong


template<typename T>
unsigned int UniqueVector<T> :: size()

    int unique_size=0;
    for(int i=0; i<3; i++)
       cout <<i<<" "<< uniVector[i] << endl; //[0] and [1] gives values? But [2] doesnt as it should 
       if(uniVector[i]!=NULL) //Only [2] is empty for some reason
          unique_size++; // if arrays arent empty, adds to total
                      
    ;        
    return (unique_size); 

int main() 


    UniqueVector<int> testVector;
    cout<< "The cap is " << testVector.capacity() << endl;
    cout<< "The size is " <<testVector.size() << endl; 

return 0;

起初我的容量函数只是一个私有的 T uniVector [3] 并且没有默认构造函数,但现在它只返回 1,而它应该是 3。

Size() 一开始就没有用过,因为当我只输入尺寸以外的任何东西时,我就是如何创造价值的。

【问题讨论】:

【参考方案1】:
uniVector = new T[3]; // default constructor 
delete []uniVector;    

首先,此构造函数分配一个包含三个Ts 的数组。

然后,这个数组立即被删除。

这毫无意义。

此外,模板的其余部分假定uniVector 是一个有效的指针。如果不是,因为它指向的数组被删除。这是未定义的行为。

template<typename T>
unsigned int UniqueVector<T> :: capacity()

    int uni_size= sizeof(uniVector)/sizeof(uniVector[0]); 
    cout << uni_size << endl; //Gives 1
    return (3); //forcing return size 3 even tho it is wrong

uniVector 是指向T 的指针。因此,sizeof(uniVector) 为您提供指针的大小(以字节为单位)。然后,除以 uniVector 指向的大小,会产生完全没有意义的结果。

很明显,您需要跟踪分配数组的大小。 sizeof 不给你。 sizeof 是一个常量表达式。 uniVector指针的大小是完全一样的,无论是指向3个值的数组,还是百万个值的数组。

你需要做的是,在构造函数中,分配大小为 3 的初始数组,然后将 3 存储在一个跟踪数组容量的类成员中,然后你的 capacity() 类方法简单地返回这个类成员的值。

同样,您还需要跟踪数组的实际大小,构造函数将其初始化为 0。

这应该足以让您入门。

【讨论】:

我相信我已经把那部分记下来了,我只是不确定是否有更简单的方法,我只是不知道为什么这个数组会包含任何东西,即使我从来没有在里面放任何东西。 存在的问题和初始化的问题是完全分开的。每个数组一开始都不包含任何东西,除了随机垃圾。

以上是关于在类中创建一个空的动态数组,在访问时给出值?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的类中创建类对象的动态数组

如何在 postgres 中创建表并插入具有动态值的数据

如何在不插入值的情况下在sql中创建动态行?

在 C++ 中创建动态对象的动态数组

在 php 中创建动态 JSON 数组

怎样在MATLAB中创建空的N维数组?