【问题标题】:How to declare an object which contains an array of integers如何声明一个包含整数数组的对象
【发布时间】:2018-11-17 18:59:47
【问题描述】:

(C++) 你好,我在声明对象时遇到了问题,让我们先看看:

class arr1D
{
protected:
    int size;
    int *arr;
public:
    arr1D( int a[] ):size(sizeof(a)/sizeof(a[0])), arr(new int[size])
    {
        for(int i = 0; i < size; i++)
        {
            arr[i] = a[i];
        }
    }
    arr1D( int siz = 10 ):size(siz), arr(new int[size])
    {
        for( int i = 0; i < size; i++)
        {
            arr[i] = 0;
        }
    }
    friend ostream & operator<<( ostream &,const arr1D &);
};
int main()
{
    //arr1D *a1 = new arr1D;
    //cout << *a1;
    //prints "arr: 0 0 0 0 0 0 0 0 0 0 size: 10"
    return 0;
}
ostream & operator<<( ostream &_return, const arr1D &a)
{
    _return << "arr: ";
    for(int i=0;i<a.size;i++)
    {
        cout << *(a.arr+i) << " ";
    }
    _return << "size: " << a.size;
    return _return;
}

我想声明一个包含整数数组的对象 像这样:

arr1D a1[] = {1,2,3,4,5}; // pseudo-code

这应该打印出这样的内容:

arr: 1 2 3 4 5 size: 5

感谢您的帮助!

【问题讨论】:

  • arr1D( int a[] ) 将不起作用,a 在此上下文中是一个指针并且丢失了大小,看看std::vector 是如何做到的,甚至使用std::vector 代替
  • 我还没有使用过矢量,现在我正在尝试以这种方式解决它。有什么想法吗?
  • 不相关,析构函数在哪里?
  • “我还没用过矢量”现在开始使用vector 永远不会太早。忘记[] 数组的存在。你也不需要new 来创建对象。 std::vector&lt;int&gt; a1 = { 1, 2, 3, 4, 5 }; 就是你所需要的

标签: c++ arrays class c++11 pointers


【解决方案1】:

我想声明一个包含整数数组的对象 像这样:(伪代码)“arr1D a1[] = {1,2,3,4,5};”这 应该打印这样的内容:“arr:1 2 3 4 5 size:5”谢谢 帮忙!

您可以通过在课堂上添加initializer list constructor 来使用它。

类似如下:

#include <iostream>
#include <initializer_list>

class arr1D
{
protected:
    int size;
    int *arr;
public:
    arr1D(std::initializer_list<int> input) : size(input.size())
    {
        int* temp = new int[size];
        int index = 0;
        for (const auto& it : input)
        {
            temp[index] = it;
            ++index;
        }
        arr = temp;
    }
        // reaming code...

观看直播HERE

请注意,您还需要在 arr1D 类中添加一个 distrctor,否则会出现内存泄漏,因为您的类中有指针成员。


作为替代方案,使用smart pointers,这是处理动态内存(在堆中分配的内容)的智能方式。

查看示例解决方案HERE

#include <iostream>
#include <initializer_list>
#include <memory>

class arr1D
{
protected:
    int size;
    std::unique_ptr<int[]> arr;
public:
    arr1D(std::initializer_list<int> input) : size(input.size())
    {
        arr = std::unique_ptr<int[]>(new int[size]);
        int index = 0;
        for (const auto& it : input)
        {
            arr[index] = it;
            ++index;
        }
    }
    .......
    .......
std::ostream & operator<<(std::ostream &_return, const arr1D &a)
{
    _return << "arr: ";
    for (int i = 0; i< a.size; i++)  std::cout << a.arr[i] << " ";

    _return << "size: " << a.size;
    return _return;
}

PS:不过这个更适合std::vector&lt;&gt;处理。如果您不知道它是如何工作的,请参阅this question

编辑:正如@M.M 提到的通过值而不是通过引用传递std::initializer_list 是合适的,编辑了类的构造函数。

【讨论】:

  • std::initializer_list 应该按值传递。 see here
  • @M.M 感谢您的回答。这对我来说很有趣。 const&amp; 实际上是我的习惯,但它并不适合任何地方。我会编辑它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
相关资源
最近更新 更多