powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять про вектор
7 сообщений из 7, страница 1 из 1
Опять про вектор
    #33639982
dimadv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно создать вектор экземпляров класса.
Компилятор выдает такую ошибку:
[C++ Error] module.cpp(87): E2285 Could not find a match for 'vector<MFunction,allocator<MFunction> >::push_back(MFunction *)'

Код: plaintext
1.
2.
3.
4.
5.
6.
 vector <MFunction>  f(koef.size());
 MFunction *temp;
 for (i= 0 ;i<koef.size();i++)
 {
  temp=new MFunction(namef[i],koef[i]);
  f.push_back(temp);
 }

MFunction -класс, конструктор имеет 2-а параметра.
Что делать подскажите
Нужно ли использовать деструктор после каждого использования экземпляра temp.

sos...............
...
Рейтинг: 0 / 0
Опять про вектор
    #33640101
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimadvНужно создать вектор экземпляров класса.
Компилятор выдает такую ошибку:
[C++ Error] module.cpp(87): E2285 Could not find a match for 'vector<MFunction,allocator<MFunction> >::push_back(MFunction *)'

Код: plaintext
1.
2.
3.
4.
5.
6.
 vector <MFunction>  f(koef.size());
 MFunction *temp;
 for (i= 0 ;i<koef.size();i++)
 {
  temp=new MFunction(namef[i],koef[i]);
  f.push_back(temp);
 }

sos...............

Объявлен вектор объектов класса MFunction, а пишется в него указатель: MFunction *temp, поэтому и ошибка.

Код: plaintext
f.push_back(*temp);
...
Рейтинг: 0 / 0
Опять про вектор
    #33640103
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И зачем вообще заморачиваться с динамическим выделением памяти (в приведенном коде memory leak, между прочим), если можно сделать проще:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
vector <MFunction>  f(koef.size());
 
 for (i= 0 ;i<koef.size();i++)
 {
   MFunction temp(namef[i],koef[i]);
   f.push_back(temp);
 }

Или даже так:

Код: plaintext
1.
2.
3.
4.
5.
6.
vector <MFunction>  f(koef.size());
 
 for (i= 0 ;i<koef.size();i++)
 {
   f.push_back(MFunction(namef[i],koef[i]););
 }
...
Рейтинг: 0 / 0
Опять про вектор
    #33640194
dimadv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда возникает еще 2-е ошибки и открывается фаил _vector.h с указанием на следующую строку:

Код: plaintext
this->_M_finish = uninitialized_fill_n(this->_M_start, __n, _Tp());

Код: plaintext
1.
2.
[C++ Error] _vector.h( 206 ): E2285 Could not find a match for 'MFunction::MFunction()'

[C++ Error] _vector.h( 206 ): E2285 Could not find a match for 'uninitialized_fill_n<_ForwardIter,_Size,_Tp>(MFunction *,unsigned int,undefined)'
...
Рейтинг: 0 / 0
Опять про вектор
    #33640263
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimadvТогда возникает еще 2-е ошибки и открывается фаил _vector.h с указанием на следующую строку:
...


Без исходника целиком трудно определить точную причину, но скорее всего для класса MFunction не определен конструктор по умолчанию (без параметров который). Из-за чего не получается скомпилировать строку

Код: plaintext
1.
vector <MFunction>  f(koef.size());

так как тут создается вектор определенной длины и элементы в нем надо как-то проинициализировать.

Выхода два: либо определить конструктор по умолчанию. Либо (если так сделать нельзя) просто заменить эту строчку на

Код: plaintext
1.
vector <MFunction>  f;

И будет даже правильней, потому что в исходном примере на самом деле что делается - создается вектор размером koef.size(). Потом в него методом push_back дописываются элементы. В результате поимеем вектор размером в два раза больше необходимого, у которого первая половина будет заполнена "пустыми" значениями.

Если вы хотите избежать перевыделений памяти и для этого сразу создаете вектор нужного размера, то либо заносите туда значения через f = (то что надо), либо как вам уже в одном топике посоветовали, воспользуйтесь методом reseve:


Код: plaintext
1.
2.
vector <MFunction>  f;
f.reserve(koef.size());

...
Рейтинг: 0 / 0
Опять про вектор
    #33640277
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из-за особенностей тегов форматирования, перекосило предпоследнюю строчку. Читать так:


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

f[ i ] = (то что надо);

либо как вам уже в одном топике посоветовали, воспользуйтесь методом reseve:
...
Рейтинг: 0 / 0
Опять про вектор
    #33640304
dimadv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое, заработало! )

Код: plaintext
1.
2.
3.
4.
vector <MFunction>  f;
 for (i= 0 ;i<koef.size();i++)
 {
  f.push_back(MFunction(namef[i],koef[i]));
 }
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять про вектор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]