Создание std :: vector <Class>с последующим вызовом конструктора класса - PullRequest
1 голос
/ 22 мая 2019

Я гуглял и переполнял этот вопрос, но не смог найти ответа.

Я пытаюсь создать вектор с пользовательским классом, с которым у меня нет проблем.Я понимаю, что мне нужно сделать:

std::vector<ExtClass> varName;

Но я хочу сделать следующее:

Поскольку varName теперь имеет тип ExtClass, я хочу вызвать его конструктор в другом классе.Чтобы уточнить, я думаю, что код объяснит это лучше всего:

class ExtClass {
    public:
        int ext;
        int pet;

    ExtClass();
};

ExtClass:ExtClass() {
    this->ext = std::rand();
    this->pet = std::rand();
}

________________________

class MainClass {
    public:
        std::vector<ExtClass> attribute;

    MainClass(int);
}

MainClass(int size) {
    this->attribute.reserve(size) // reserving enough places in vector
    for (int i = 0; i < size; ++i)
        this->attribute[i] = new ExtClass(); // problem
}

Я использовал все открытые члены, чтобы избежать ненужного кода.

Я думал, так как атрибут std :: vector является векторомэлементов ExtClass, и поскольку ни один из них не был определен, я мог бы назначить каждый элемент вектора следующим образом:

new ExtClass()

, и это создаст, например:

attribute[0].ext = 5125;
attribute[0].pet = 151;

Этоэто определенно не тот случай, и компилятор утверждает в этой строке:

note: candidate: constexpr ExtClass& ExtClass::operator=(const ExtClass&)
class ExtClass {
      ^~~~~~
note:   no known conversion for argument 1 from ‘ExtClass*’ to ‘const ExtClass&’
note: candidate: constexpr ExtClass& ExtClass::operator=(ExtClass&&)
note:   no known conversion for argument 1 from ‘ExtClass*’ to ‘ExtClass&&’

Я не специалист по C ++, но относительно новичок в этом и практикуюсь.Можете ли вы сказать мне, в чем моя ошибка?Какое предположение я сделал неправильно?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 мая 2019

Код, как написано, может быть исправлен следующим образом:

MainClass(int size) 
   : attribute( size )
{
}

, то есть он инициализирует attribute с size построенными по умолчанию объектами ExtClass.

Обратите внимание, что этот код:

this->attribute.reserve(size) // reserving enough places in vector
for (int i = 0; i < size; ++i)
    this->attribute[i] = new ExtClass(); // problem

, даже если мы исправим его для компиляции:

this->attribute.reserve(size) // reserving enough places in vector
for (int i = 0; i < size; ++i)
    this->attribute[i] = ExtClass(); // problem

приводит к UB, когда вы пытаетесь получить доступ к элементам пустого вектора- резерв вызовов не меняет количество векторов объектов, а только емкость для будущего использования.

2 голосов
/ 22 мая 2019

Как показывают вышеприведенные комментарии, вы можете заменить:

for (int i = 0; i < size; ++i)
    this->attribute[i] = new ExtClass();

на:

for (int i = 0; i < size; ++i)
    this->attribute.emplace_back ();

Тогда ваш вектор будет управлять временем жизни ваших ExtClass объектов.

...