У меня возникли проблемы с пониманием того, как использовать динамическое распределение с помощью конструкторов.C++: оператор new и конструктор по умолчанию
Я использую в своем коде класс с именем graph (который представляет собой всего лишь двухмерную матрицу bool, представляющую ребра между узлами) со следующим конструктором/деструктором (есть другие методы, но я не думаю, что это имеет значение здесь):
class graph{
private:
bool** edges;
int size;
public:
graph(int size = 0):size(size){
edges = new bool*[size];
for (int i = 0; i < size; i++){
edges[i] = new bool[size];
}
}
~graph(){
for(int i = 0; i < size; ++i) {
delete [] edges[i];
}
delete [] edges;
}
//others methods
};
в моем главном, я хочу использовать динамическое распределение:
int main()
{
int size;
cout << "Enter graph size :" << endl;
cin >> size;
graph g1 = new graph(size);
//some processing code
return 0;
}
Howewer, я получаю сообщение об ошибке на конкретизации (т.е. нового графика (размер)):
недействителен преобразование из «графа *» до «» межд [-fpermissive]
Я не получить то, что происходит не так, и я уверен, что это синтаксис я уже видел в других местах.
На самом деле, я действительно не понимаю, как распределение памяти работает с созданием объекта.
Здесь я использую новый в моем конструкторе для создания bool 2d-матрицы, так что это будет куча, нет? Но если я инициализирую объект, используя следующую статическую инструкцию: graph g1 (const_size);
Тогда это не значит, что нужно идти в стек?
Заранее благодарю вас за ответы.
EDIT
Только один последний вопрос:
график * g1 = новый график (размер);
хранит g1 (указатель) в стеке, но объект создается в куче.
g1 (размер);
создает объект в стеке, а g1 является ссылкой на него.
Но в любом случае края матрицы будут находиться на куче? Или во втором случае это как-то закончится в стеке?
'graph * g1 = ...' но серьезно, * почему * вам нужно динамическое размещение там? – juanchopanza
По правде говоря, было больше понять, как я мог бы это сделать, если бы это было необходимо. Мне это действительно не нужно прямо сейчас. Но, например, если мне нужна программа, которая может иметь дело с разным размером графика, не перекомпилируя ее каждый раз, когда я хочу работать с другим размером, мне нужно что-то подобное, нет? – Demod
Не в основном. Там вы можете просто сказать 'graph g1 (42);' – juanchopanza