使用指向需要传入变量的对象的指针数组

问题描述 投票:0回答:1

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

主要是我试图创建一个包含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]不起作用。

c++ arrays dynamic-memory-allocation
1个回答
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 ...
}
© www.soinside.com 2019 - 2024. All rights reserved.