2012-02-29 3 views
1

Я пытаюсь использовать стек stdlib в классе, который я создал, но у меня возникают проблемы с его динамическим развитием.Динамически выделять стек stdlib?

Вот соответствующий код из моего заголовка файла «matcher.h»:

private: 

     stack<char> opens; 

и вот конструктор, который я создаю, что только выделяет стек:

#include "matcher.h" 
using namespace std; 
//Creates a matcher object with the default values. 
matcher::matcher() 
{ 
    opens = new stack<char>; 
} 

Ошибка Я получаю ниже:

matcher.cpp:19:17: error: no match for ‘operator=’ in ‘((matcher*)this)->matcher::opens = ((*(const std::deque<char, std::allocator<char> >*)(& std::deque<char, std::allocator<char> >())), (operator new(40u), (<statement>, ((std::stack<char>*)<anonymous>))))’ 

Это говорит мне, что std::stack делает п ot содержит оператор присваивания, что приводит меня к моему вопросу:

Какой метод я должен использовать, чтобы получить стек, который будет сохраняться в моем объекте сопряжения, если он не содержит оператор присваивания?

Благодарим за ваше время.

+2

При переходе с Java или C# вам нужен курс C++. –

+0

Я пытаюсь научить себя :) – Joshua

ответ

3

opens - это объект внутри класса, поэтому ему не нужно выделять new.

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

Если у вас есть элемент, который не может (или не должны) быть конструктором по умолчанию, то вы делаете что в списке инициализатора конструктора, например:

class matcher { 
public: 
    matcher() : 
     number(42) // initialise with a value 
    {}    // nothing else to do - "opens" is automatically initialised 

private: 
    stack<char> opens; 
    int number; 
}; 

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

+0

Да, спасибо. По какой-то причине я думал, что вам нужно выделить его, когда вы создали класс. – Joshua

2

new всегда возвращает указатель указанному типу. opens должно быть stack<char> *.

Но вы уверены, что вам нужно динамически выделять стек? Частная членская переменная, которую вы можете создать в конструкторе, редко нуждается в динамическом распределении. Если вы распределите его динамически, вы должны указать delete в деструкторе.

1

Вы назначаете результат нового, который будет указателем на стек. Другими словами, вы пытаетесь назначить стек * стеку.

Во-вторых, почему вы это делаете? В любом случае стек будет выделять элементы на куче. Нет необходимости в новых.

1

Вы не можете назначить stack<char>*, что и возвращает new stack<char>, к переменной stack<char>. Вместо этого, вы должны использовать следующий конструктор:

// look ma, no need for new! 
matcher::matcher() 
{ 
} 

и полагаться только на инициализацию по умолчанию opens. Стек будет соответствующим образом уничтожен, если ваш объект matcher.

0

Здесь есть как минимум две проблемы.

private: 
    stack<char> opens; 

Это означает, что вы либо в вашем заголовке using namespace std; (очень плохая форма) или вы потребовав, чтобы иметь один using namespace std; заявления, прежде чем включать заголовок (еще хуже форму).

Другая проблема - это непосредственная причина ошибки вашего компилятора. Вы не должны выделять этот стек opens. Чтобы иметь возможность выделить opens, требуется объявить его как std::stack<char>* opens; - и это тоже то, чего вы обычно не хотите делать. С объявлением как есть, std::stack<char> opens;, переменная уже существует. Его просто нужно построить. Если вы не укажете, как построить объект в списке инициализаторов вашего конструктора, по умолчанию будет использоваться конструктор по умолчанию.

Смежные вопросы