Использование массива указателей на объекты, которые требуют переменных, переданных в - PullRequest
0 голосов
/ 19 февраля 2019

У меня 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] не работает.

1 Ответ

0 голосов
/ 19 февраля 2019

В вашем классе 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 ...
}
...