【问题标题】:How to initialize an array pointer object如何初始化数组指针对象
【发布时间】:2019-12-05 21:38:36
【问题描述】:

我在初始化(构造函数)对象的数组指针时遇到了一点问题。请参阅下面的课程。类 test 有 2 个变量成员,一个将是数组的指针(值)和他的大小(大小);以及一个带参数的构造函数和一个析构函数。在主函数中,我将创建一个对象数组指针,但我有问题。如果我创建一个像这样的对象:

  • test obj(4);会创建一个对象,他的实例,值数组是大4。

如果我想创建一个对象数组:

test *obj;
obj = new test[2]{4,7};

我将创建 2 个对象:obj[0] 是大 4,obj[1] 是大 7。

所以如果我想创建更多对象:

test *obj;
obj=new test[100]{/*here I must write 100 numbers*/}

这就是问题所在。 因为我不会写这样的东西:

test *obj;
obj=new int[100]{4}

我希望每个值[](测试类的实例)都是大 4,我不会写 100 次“4”。 我想到了声明数组的类比: 如果我写int array[5]={0,0,0,0,0},我必须写4次“0”,或者我也可以写: int array[5]={0},每个值都设置为0。(如果写int array[5]={5},第一个索引将为5,其他为0)。

我应该使用默认构造函数吗?我该怎么办?

#include <iostream>

using namespace std;

class test
{
private:
int* value;
int size;

public:
test(int size)
{
    this->size = size;
    value = new int[size];
}

~test()
{
    delete[]value;
}
};

【问题讨论】:

  • 为什么不直接使用std::vector
  • 是的,这是另一种可能的方式。但我会知道该怎么做(只是为了知识)。
  • test 不遵循 5/3/0 的规则。导致复制/移动问题。将std::vector 用于value 将解决该问题。

标签: c++ object pointers constructor


【解决方案1】:

您可以在堆栈上分配内存,摆脱动态分配和内存管理。

test array[100];
std::fill(std::begin(array), std::end(array), test(100));

请注意,这里需要一个默认构造函数。

【讨论】:

    【解决方案2】:

    您可以遍历指针来初始化每个元素

    test *obj = new test[100];
    for(size_t i = 0; i != 100; ++i)
    {
        obj[i] = test(/*parameters*/);
        /* Remember to provide a move assignment operator
    which invalidates the pointer member, otherwise when the
    temporary variable is destroyed the new object pointer
    member will point to data no more available*/
    }
    
    // ...
    delete [] obj;
    

    不过最好使用std::vector

    std::vector<test> obj(100, test(/*parameters*/));
    

    使用 std::vector 你的 test 对象被初始化 100 次传递它的参数,使用指针分配 (new test[100]) 将默认构造每个元素,然后你将为每个元素分配新值,这就是为什么std::vector 可以更好地解决您的问题

    【讨论】:

    • 对不起,我不小心写了new int[100],我已经编辑了答案
    • prog.cpp:25:25: error: no matching function for call to ‘test::test()’,如果添加默认构造函数,运行时会崩溃。
    • 对于指针替代,需要一个默认构造函数。关于崩溃,你能发布你收到的错误吗?
    • 这是双免费的。
    • 是的,您需要一个默认构造函数。测试::test(){ }
    猜你喜欢
    • 2014-03-14
    • 2015-12-31
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多