【问题标题】:Using an array of pointers to objects that require variables passed in使用指向需要传入变量的对象的指针数组
【发布时间】:2019-02-19 02:48:08
【问题描述】:

我有 3 个文件。 main.cpp、object.h 和 object.cpp。

在 main 中,我试图创建一个包含 100 个对象指针的数组。然后,在创建数组之后,我进入一个循环并遍历每个“i”元素,并将该元素的值作为指向新临时对象的指针分配给将在字符串中传递的新临时对象。 这样做的基本前提是我可以使用它来存储多个对象,这些对象内部包含信息,之后我可以通过在这些点上调用函数来打印这些信息。我需要使用指针数组来执行此操作。

本质上,我想将数据存储在一个对象指针数组中,该数组将使用一个新的运算符来存储它每次迭代。但是,我什至不确定如何创建数组,因为它需要传入要调用的变量。

我试过 Object *ptr = new Object[arraySize];我确信这会起作用,但它需要参数,因为对象被定义为在其中获取变量。

main.cpp

#include <iostream>
#include "object.h"

int main()
{
    Object *ptr = new Object[5];
    for(i = 0; i < 5, i++) {
        ptr[i] = "Test";
        ptr -> print();
    }

}

object.cpp

#include "object.h"
#include <iostream>

using namespace std;

Object::Object(string words)
{
    private_words = words;
}

void Object::print()
{
    cout << private_words << endl;
}

object.h

#ifndef OBJECT_H
#define OBJECT_H

#include <string>

using namespace std;

class Object
{

    public:
        Object(string words);
        void print();
    private:
        string private_words;
};

#endif

关于我尝试传入参数并同时将其设为数组这一事实,我收到了多个难以理解的错误。 Object *ptr = new Object()[5] 不起作用。

【问题讨论】:

  • 创建一个包含 100 个对象指针的数组(您在问题中要求但我不确定您是否真的想要),Object *ptr[100];。请注意,这 100 个指针未初始化,当前指向未定义的某个位置。在您将指针指向一个有效的Object 实例(可能是用new 创建的,但try to avoid new where possible)之前,不要尝试取消引用指针(获取指针处的对象)。

标签: c++ arrays dynamic-memory-allocation


【解决方案1】:

您的Object 类缺少默认构造函数,这就是new Object[...] 不起作用的原因。您将不得不使用更像这样的东西:

#include <iostream>
#include "object.h"

int main()
{
    Object **ptr = new Object*[5];
    for(i = 0; i < 5, i++) {
        ptr[i] = new Object("Test");
    }

    // use ptr as needed ...

    for(i = 0; i < 5, i++) {
        ptr[i]->print();
    }

    // cleanup ...

    for(i = 0; i < 5, i++) {
        delete ptr[i];
    }
    delete[] ptr;
}

最好使用标准容器,让编译器为您管理内存。

C++11 之前:

#include <iostream>
#include <memory>
#include "object.h"

int main()
{
    // NOTE: std::auto_ptr is NOT a container-safe type...
    std::auto_ptr<Object>* ptr = new std::auto_ptr<Object>[5];
    for(i = 0; i < 5, i++) {
        ptr[i].reset(new Object("Test"));
    }

    // use ptr as needed ...

    for(i = 0; i < 5, i++) {
        ptr[i]->print();
    }

    // cleanup ...
    // only the array is needed manually, the individual elements
    // will clean themselves up when they are destructed ...

    delete[] ptr;
}

在 C++11 及更高版本中,请改用:

#include <iostream>
#include <vector>
#include <memory>
#include "object.h"

int main()
{
    // NOTE: std::unique_ptr IS a container-safe type...
    std::vector<std::unique_ptr<Object>> ptr(5);
    for(i = 0; i < 5, i++) {
        ptr[i].reset(new Object("Test"));

        // or:
        // ptr[i] = std::unique_ptr<Object>(new Object("Test"));

        // or, in C++14 and later:
        // ptr[i] = std::make_unique<Object>("Test");
    }

    // use ptr as needed ...

    for(i = 0; i < 5, i++) {
        ptr[i]->print();
    }

    // all cleanup is automatic when ptr goes out of scope ...
}

【讨论】:

  • 写 Object **ptr = new Object*[5]; ?你得到的是指针的值,它是一个指针?我对它应该如何工作感到有点困惑。为 Object 类添加默认构造函数会是更好的解决方案吗?如果是这样,我该怎么做?
  • @Jaskal new 返回一个指向它分配的内存的指针。 new T 分配一个 T 并返回一个 T* 指针。 new T[] 分配了一个 T 数组,并且仍然返回一个 T* 指针。在我的第一个示例中,TObject*,因此 new Object*[5] 分配了一个包含 5 个 Object* 指针的数组,并返回一个指向该数组的 Object** 指针。
  • @Jaskal 添加default constructor 将允许您使用Object *arr = new Object[5]Object arr[5]std::vector&lt;Object&gt; arr(5) 等内容,所以拥有它是件好事。但它不会帮助你理解指针。
猜你喜欢
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
相关资源
最近更新 更多