Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
1

Vector ругается на использование классов E2397 и Invalid pointer operation

02.04.2012, 00:00. Показов 2022. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не получается использовать vector с собственными классами
выдает либо [BCC32 Error] Unit1.cpp(62): E2397 Template argument cannot have static or local linkage, либо Invalid pointer operation.

сократил код до того, что видите ниже и не понимаю, почему стандартные типы переменных вектор воспринимает и не ругается. А на класс ругается. Скажите, что я не правильно делаю =(

Ошибка "Invalid pointer operation" возникает когда в цикле при помощи push_back создаются новые объекты. При чем вылетает ошибка на 2,3 интерации, первая всегда проходит без проблем. Если интерацию заменить ручным вводом push_back , то ошибка "Invalid pointer operation" вылетает при попытки закрыть откомпилировонную программу (при выходе)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <vector.h>
#define GTB Graphics::TBitmap
struct GPS
{
    short x;
    short y;
    void Set(short X, short Y) {x=X; y=Y;};
};
class CBot
{
    private:
        GPS m_pos;
        GTB * m_Pic;
 
 
    public:
        CBot()
        {
            m_Pic = new GTB();
            m_Pic->LoadFromFile("./solder.bmp");
            m_Pic->Transparent = true;
            m_pos.Set(0,0);
        };
        CBot(short X,short Y)
        {
            m_Pic = new GTB();
            m_Pic->LoadFromFile("./solder.bmp");
            m_Pic->Transparent = true;
            m_pos.Set(X,Y);
        }
        ~CBot() {  delete m_Pic;};
        short ReturnX() {return m_pos.x;} ;
        short ReturnY() {return m_pos.y;} ;
        GTB* ToDraw() {return m_Pic;}  ;
};
 
 
vector<int> v_ints;
 
for (int i=0 ; i < 10 ; i++)
{
    v_ints.push_back(10*i);
}
 
 
vector <CBot> v_bots;  //[BCC32 Error] Unit1.cpp(62): E2397 Template argument 
                                 //    cannot have static or local linkage
 
for (int i=0 ; i < 10 ; i++)
{
    v_bots.push_back(10*j);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2012, 00:00
Ответы с готовыми решениями:

Invalid pointer operation
Здравствуйте. Пишу программу для заполнения таблицы идентификаторов и когда приступил к ее заполнению в форме упорядоченного списка...

invalid pointer operation
for (global_index1 = 0; global_index1 &lt; t-&gt;dir_list-&gt;Count; global_index1++) { for (int j = 0; j &lt;...

Invalid Pointer Operation
Приветствую всех неравнодушных к проблемам начинающих). Вопрос собственно по ошибке подскажите самые распространённые причины...

13
Эксперт С++
 Аватар для Avazart
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.04.2012, 00:14 2
C++
1
2
3
4
5
6
7
8
9
for (int i=0 ; i < 10 ; i++)
{
    v_ints.push_back(10*i);
}
//...
for (int i=0 ; i < 10 ; i++)
{
    v_bots.push_back(10*j);
}
Почему вне main() ?

Добавлено через 3 минуты
C++
1
v_bots.push_back(10*j);
что такое j и почему 10*j помещается в контейнер <CBot> ???

Добавлено через 3 минуты
Вместо GPS можно было использовать стандартный TPoint
1
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
02.04.2012, 07:32  [ТС] 3
извиняюсь, копипастил в компилятор, компилятор поправил, а тут переправить я забыл.

Цитата Сообщение от Avazart Посмотреть сообщение
Почему вне main() ?

В Билдере писал, весь код находится в __fastcall TMainWindow::TMainWindow(TComponent* Owner) : TForm(Owner)


Цитата Сообщение от Avazart Посмотреть сообщение
что такое j и почему 10*j помещается в контейнер <CBot> ???
Извините, вот так вот
C++
1
2
3
4
for (int j=0 ; j < 10 ; j++)
{
    v_bots.push_back(CBot(10*j,5*j));
}
и подключение векторов в h файле
C++
1
2
//main.h
#include <vector.h>
Цитата Сообщение от Avazart Посмотреть сообщение
Вместо GPS можно было использовать стандартный TPoint
Это упрощенный вариант, думал может ошибка не связана с vector и просто вырезал код. В GPS больше переменных, нужных мне.
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
02.04.2012, 07:52 4
может нужно создать конструктор копии,чтоб он мог копировать значения в вектор?
1
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
02.04.2012, 10:57  [ТС] 5
Цитата Сообщение от alexey31415 Посмотреть сообщение
может нужно создать конструктор копии,чтоб он мог копировать значения в вектор?
добавил конструктор копий... заработало
C++
1
2
3
4
5
6
7
8
CBot::CBot(const CBot & OriginalBot)
{
    m_Pic = new GTB();
    m_Pic->LoadFromFile("./solder.bmp");
    m_Pic->Transparent = true;
    //m_pos.Set(OriginalBot.ReturnX(),OriginalBot.ReturnY());
    m_pos.Set(rand()%800, rand()%600);
}
Но почему-то теперь я в замешательстве, а должен был бы быть рад. Я читал книгу про STL, но там все примеры были с базовыми типами данных (int,char,string). Можете мне объяснить в кратце, но понятно, по какому принципу добавляются в контейнеры новые объекты класса? Почему нельзя создавать новый объект без копирования? Если есть ссылка где бы были расписаны подробности работы контейнеров STL - буду очень рад.

Добавлено через 30 минут
Я совершенно неграмотно составил конструктор копий (так как мне надо было рандомное позиционирование, я использовал Random()), но в результате когда создавался очередной объект CBot, неумещяющийся в контейнер, контейнер расширялся копируя старые объекты и меня заданные им позиции. Решил сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CBot::CBot(const CBot & OriginalBot)
{
    m_Pic = new GTB();
    m_Pic->LoadFromFile("./solder.bmp");
    m_Pic->Transparent = true;
    m_pos.Set(OriginalBot.ReturnX(),OriginalBot.ReturnY());
}
 
CBot::CBot(const CBot & OriginalBot, short X, short Y)
{
    m_Pic = new GTB();
    m_Pic->LoadFromFile("./solder.bmp");
    m_Pic->Transparent = true;
    m_pos.Set(X,Y);
}
Но все ровно не понимаю зачем тогда мне CBot(short,short)

Вопрос Почему функции Random и Rand()% всегда выдают одинаковую последовательность "рандомных" значений. (Запускаю программу последовательность - 0, 152, 364, 32 ... закрываю программу, запускаю снова и абсолютно в таком же порядке выдаются значения) Я понимаю что абсолютного рандомного значения у компьютера не будет. Но я пробывал с разными интервалами времени и всеровно одно и тоже (тоесть с внутренними мс времени работы это ни как не связано). Почему так?

Понял как без CBot(const CBot&, short,short) сделать

C++
1
2
3
//посто добавлять таким макаром
v_bots.push_back(CBot(CBot(Random(800),Random(600))));
//ссори если баяню, не спец.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2012, 12:47 6
Цитата Сообщение от Deimon Посмотреть сообщение
Почему нельзя создавать новый объект без копирования?
Потому что при изменении размера вектора, объекты из старого вектора копируются в новый.
1
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
02.04.2012, 17:15 7
зачем создавать конструктор копий
чтоб компилятор знал,как копировать данные в вектор,ибо ваши данные(то есть сделанные вами и как следствие не являющиеся родными) он не знает,о них ничего не слышал и конечно не знает как с ними работать
Цитата Сообщение от Deimon Посмотреть сообщение
Почему функции Random и Rand()% всегда выдают одинаковую последовательность "рандомных" значений.
потому что это псевдослучайная последовательность чисел,если хочешь действительно случайную напиши так
srand(time(0));//функция для засеивания генератора чисел
rand() % ...
1
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.04.2012, 19:12 8
alexey31415, вообще компилятор всегда предоставляет конструктор копии и оператор присваивания, если таковые не определены программистом. Эти функции просто копируют все поля класса с использованием их конструкторов копии (plain-типы просто побайтно копируются). Однако если класс предоставляет пользование некоторым ресурсом, который логически должен разделиться при копировании, и это разделение не может быть произведено автоматически (указатель, указывающий на динамическую память, будет просто скопирован, и оба указателя начнут указывать на одну и ту же память; логически же необходимо выделить новую память и скопировать туда информацию из старой), то тут и возникает необходимость реализовывать собственные конструктор копии и оператор присваивания.
2
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2012, 19:25 9
Цитата Сообщение от silent_1991 Посмотреть сообщение
компилятор всегда предоставляет конструктор копии и оператор присваивания
Кроме случаев, когда пользователь объявит свой конструктор. А тут уже есть конструктор с параметрами, поэтому компилятор и не генерит конструктор копирования.
1
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.04.2012, 19:44 10
Deviaphan, насколько я помню, верно обратное, т.е. если определён конструктор копии, то конструктор по умолчанию не предоставляется. Конструктор же копии есть всегда. Примеры:
http://liveworkspace.org/code/... a21e8f1671
http://liveworkspace.org/code/... afd417f693
1
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2012, 20:05 11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Конструктор же копии есть всегда
А может и так. Утверждать не буду, не помню.) Как-то не было возможности проверить...
0
Эксперт С++
 Аватар для Avazart
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.04.2012, 20:15 12
А ошибка из за того что в классе есть указатели на дин. объекты ?
Т.е по умолчанию конструктор копий работает неправильно
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.04.2012, 20:17 13
Avazart, если это вопрос, то да, КК по умолчанию просто скопирует указатели, а потом, в деструкторе, память два раза освободится (в оригинальном объекте и в копии).
1
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
03.04.2012, 09:07  [ТС] 14
Всем спасибо Подчеркнул для себя много важного и полезного!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2012, 09:07
Помогаю со студенческими работами здесь

Invalid pointer operation
Добрый вечер. Возникает такая ошибка при выключении программы: invalid pointer operation. Используется DLL. extern...

Invalid pointer operation
Всем доброго времени суток. Уважаемые.......в общем, написал функцию....она вроде как работает, по крайней мере, после её выполнения...

Invalid pointer operation
Почему данная конструкция вызывает ошибку &quot;invalid pointer operation&quot;? sizeV = panel.size() - 1, в векторе label аналогичное число...

Invalid pointer operation
Создал программу для поиска седловых точек в матрице (если элемент матрицы максимален в своей строке и минимален в своём столбце, или...

invalid pointer operation
function MathFunc.MyMath(m:integer):integer; var i1,i,n,i2,i3:integer; b,g,a:mas; h,pkt:double; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Неблокируемый стек в C++26: реализуем простой сборщик мусора
stackOverflow 02.03.2025
Многопоточные приложения требуют надежных и производительных структур данных, способных эффективно работать в условиях конкурентного доступа. Неблокируемые структуры данных представляют собой особый. . .
Шаблон REQ/REP в ZeroMQ: сверхбыстрый обмен сообщениями в C++ и Python
stackOverflow 02.03.2025
Построение высоконагруженных распределенных систем требует надежного и производительного механизма обмена сообщениями. ZeroMQ выделяется среди прочих решений своей невероятной скоростью работы и. . .
Нестандартные приемы работы с итераторами в C++
stackOverflow 02.03.2025
Итераторы - один из краеугольных камней C++, предоставляющий универсальный механизм обхода и манипуляции данными в контейнерах. Появившись как замена небезопасным указателям, они эволюционировали от. . .
Лексический анализ и регулярные выражения в C++26
stackOverflow 02.03.2025
Лексический анализ - ядро любого компилятора и инструмента обработки текста. Каждый программист сталкивается с задачами парсинга строк, обработки файлов конфигурации или анализа пользовательского. . .
Подробно о std::mdspan в C++23
stackOverflow 02.03.2025
Работа с многомерными массивами данных традиционно была одной из сложных задач в C++. Программистам приходилось создавать собственные абстракции или использовать сторонние библиотеки для эффективной. . .
Колмогоровская сложность в C++: Путь к совершенному коду
stackOverflow 02.03.2025
Абстрактная математическая теория Колмогорова стала мощным средством оценки и улучшения программного кода. Сложность алгоритма - не только в его вычислительной эффективности, но и в том, насколько. . .
Изменения в C# 14
stackOverflow 02.03.2025
Одно из самых значимых изменений в C# 14 - поддержка коллекционных выражений, которые позволяют создавать и инициализировать коллекции с помощью нового лаконичного синтаксиса. Это нововведение. . .
Разработка кроссплатформен­­­­ного мобильного приложения для iOS/Android на C++
bytestream 02.03.2025
C++ как язык программирования высокого уровня с прямым доступом к аппаратным ресурсам позволяет создавать приложения, работающие одинаково быстро как на iOS, так и на Android устройствах. Ни для кого. . .
Аутентификация/авторизация на Golang
bytestream 02.03.2025
Go предлагает множество возможностей для создания надежных систем аутентификации. Встроенные криптографические пакеты, высокая производительность и простота параллельной обработки запросов делают его. . .
Нововведения TypeScript 5.8
bytestream 02.03.2025
TypeScript 5. 8 приносит много возможностей и оптимизаций, которые существенно расширяют границы типобезопасного программирования на JavaScript. Эта версия включает ряд значительных улучшений в работе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru