Почему это распределение вектора не принято? - PullRequest
3 голосов
/ 17 октября 2011

Итак, я объявил вектор в заголовке моего класса следующим образом:

 ...
 private:
    vector<Instruction> instructions;
 ...

Затем в реализации .cpp в конструкторе я пытаюсь инициализировать его следующим образом:

 instructions = new vector<Instruction>();

Xcode говорит мне: No viable overloaded '='

Я в основном пытаюсь заставить этот класс вести себя так, как я ожидал бы в Java, где экземпляры класса сохраняют этот вектор.Вот почему я хотел динамически распределить его, используя new, чтобы убедиться, что он не теряется в стеке или чем-то еще.Любая помощь будет оценена с этим, большое спасибо.

Ответы [ 7 ]

4 голосов
/ 17 октября 2011

Чтобы сделать то, что вы пытаетесь сделать, строка instructions = new vector<Instruction>() совершенно не нужна. Просто удали это. Вектор будет автоматически создан по умолчанию при создании экземпляра вашего класса.

Альтернативой является превращение instructions в указатель, но здесь нет никаких причин делать это.

3 голосов
/ 17 октября 2011

когда вы пишете

vector<Instruction> instructions;

, у вас уже есть инстанцированные инструкции к любой модели памяти, используемой пользователем вашего класса, например

class YourClass
{
vector<Instruction> instructions;
};

...
int main()
{
   YourClass class1; // stack
   std::unique_ptr<YourClass> class2(new YourClass); // heap
...
}
2 голосов
/ 17 октября 2011

operator new возвращает указатель, поэтому у вас есть несоответствие типов.

Реальная проблема заключается в том, что вы делаете это вообще.У вас есть веская причина для динамического выделения этого вектора?Я сомневаюсь в этом, просто опустите это полностью, так как оно будет выделяться вместе с экземплярами вашего типа.

2 голосов
/ 17 октября 2011

В вашем классе вы объявляете std::vector<Instruction>. new vector<Instruction>(); возвращает вам std::vector<Instruction>*.

1 голос
/ 17 октября 2011

Не используйте new в C ++, если вы не знаете, что делаете. (Что вы не делаете, в настоящее время.)

Вместо этого используйте автоматические объекты. Вы уже определили instructions как автоматический объект. Вам просто нужно инициализировать его так, как если бы он был одним:

class wrgxl {
 public:
   wrgxl()
    : instructions() // this initializes the vector using its default constructor
   {
     // nothing needed here
   }
 ...
 private:
    vector<Instruction> instructions;
 ...
};

Инициализация instructions в списке инициализации конструктора не является обязательной, однако, если вы все равно хотите вызвать конструктор по умолчанию. Так что в этом случае этого будет достаточно:

wrgxl()
{
}

Если вы хотите динамически выделить вектор, вам нужно сделать instructions указателем на вектор. Но это редко когда-либо имеет смысл, поскольку вектор уже распределяет свои данные динамически, но оборачивает это, так что вам не придется иметь дело с уродливыми деталями, возникающими в результате этого.
Одна из таких деталей заключается в том, что если у вас есть динамически размещенный объект в классе, вам придется беспокоиться об уничтожении, создании копии и назначении копирования для этого класса.

Как уже отмечал Керрек, для правильного изучения C ++ вам понадобится хорошая книга по C ++ . Сделайте свой выбор .

1 голос
/ 17 октября 2011

У вас есть значение элемента, но вы пытаетесь инициализировать его с vector<Instruction>*. Инициализируйте его с vector<Instruction> или измените объявление на указатель. Если вы идете по второму маршруту, вам нужно соблюдать правило трех .

Вы также можете получить приличную книгу по C ++ из этого списка.

Кроме того, я думаю, что у вас в заголовке есть using namespace std;, что плохо.

0 голосов
/ 17 октября 2011

Я думаю, что вы путаете C ++ с синтаксисом C #.

Во-первых, в отличие от многих языков, переменные, расположенные в стеке (например, у вас), инициализируются вызовом конструктора по умолчанию, поэтому я подозреваю, чтовы делаете это не нужно.

Во-вторых, чтобы сделать то, что вы пытаетесь сделать, вы используете следующий синтаксис:

instructions = vector<Instruction>();

однако, как я уже сказал, это, вероятно, избыточно(и расточительствует неоптимизирующий компилятор, поскольку он может вызывать как конструктор, так и оператор присваивания).Гораздо лучший способ сделать это можно найти в ответе sbi.

В-третьих, в отличие от C #, оператор new выделяет память в куче и возвращает указатель на вновь распределенные данные.Ваша переменная instructions не является указателем, поэтому ошибка.

...