Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
02.04.2012, 00:00     Vector ругается на использование классов E2397 и Invalid pointer operation #1
Не получается использовать 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);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2012, 00:00     Vector ругается на использование классов E2397 и Invalid pointer operation
Посмотрите здесь:

C++ Компилятор ругается : cannot convert 'this' pointer
string, invalid null pointer C++
Ругается на vector C++
vector<pointer>::iterator C++
Invalid pointer addition C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,593
Записей в блоге: 17
02.04.2012, 00:14     Vector ругается на использование классов E2397 и Invalid pointer operation #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
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
02.04.2012, 07:32  [ТС]     Vector ругается на использование классов E2397 и Invalid pointer operation #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 больше переменных, нужных мне.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.04.2012, 07:52     Vector ругается на использование классов E2397 и Invalid pointer operation #4
может нужно создать конструктор копии,чтоб он мог копировать значения в вектор?
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
02.04.2012, 10:57  [ТС]     Vector ругается на использование классов E2397 и Invalid pointer operation #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))));
//ссори если баяню, не спец.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2012, 12:47     Vector ругается на использование классов E2397 и Invalid pointer operation #6
Цитата Сообщение от Deimon Посмотреть сообщение
Почему нельзя создавать новый объект без копирования?
Потому что при изменении размера вектора, объекты из старого вектора копируются в новый.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.04.2012, 17:15     Vector ругается на использование классов E2397 и Invalid pointer operation #7
зачем создавать конструктор копий
чтоб компилятор знал,как копировать данные в вектор,ибо ваши данные(то есть сделанные вами и как следствие не являющиеся родными) он не знает,о них ничего не слышал и конечно не знает как с ними работать
Цитата Сообщение от Deimon Посмотреть сообщение
Почему функции Random и Rand()% всегда выдают одинаковую последовательность "рандомных" значений.
потому что это псевдослучайная последовательность чисел,если хочешь действительно случайную напиши так
srand(time(0));//функция для засеивания генератора чисел
rand() % ...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.04.2012, 19:12     Vector ругается на использование классов E2397 и Invalid pointer operation #8
alexey31415, вообще компилятор всегда предоставляет конструктор копии и оператор присваивания, если таковые не определены программистом. Эти функции просто копируют все поля класса с использованием их конструкторов копии (plain-типы просто побайтно копируются). Однако если класс предоставляет пользование некоторым ресурсом, который логически должен разделиться при копировании, и это разделение не может быть произведено автоматически (указатель, указывающий на динамическую память, будет просто скопирован, и оба указателя начнут указывать на одну и ту же память; логически же необходимо выделить новую память и скопировать туда информацию из старой), то тут и возникает необходимость реализовывать собственные конструктор копии и оператор присваивания.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2012, 19:25     Vector ругается на использование классов E2397 и Invalid pointer operation #9
Цитата Сообщение от silent_1991 Посмотреть сообщение
компилятор всегда предоставляет конструктор копии и оператор присваивания
Кроме случаев, когда пользователь объявит свой конструктор. А тут уже есть конструктор с параметрами, поэтому компилятор и не генерит конструктор копирования.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.04.2012, 19:44     Vector ругается на использование классов E2397 и Invalid pointer operation #10
Deviaphan, насколько я помню, верно обратное, т.е. если определён конструктор копии, то конструктор по умолчанию не предоставляется. Конструктор же копии есть всегда. Примеры:
http://liveworkspace.org/code/3cd496...2329a21e8f1671
http://liveworkspace.org/code/192cf2...e57fafd417f693
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.04.2012, 20:05     Vector ругается на использование классов E2397 и Invalid pointer operation #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
Конструктор же копии есть всегда
А может и так. Утверждать не буду, не помню.) Как-то не было возможности проверить...
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,593
Записей в блоге: 17
02.04.2012, 20:15     Vector ругается на использование классов E2397 и Invalid pointer operation #12
А ошибка из за того что в классе есть указатели на дин. объекты ?
Т.е по умолчанию конструктор копий работает неправильно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.04.2012, 20:17     Vector ругается на использование классов E2397 и Invalid pointer operation #13
Avazart, если это вопрос, то да, КК по умолчанию просто скопирует указатели, а потом, в деструкторе, память два раза освободится (в оригинальном объекте и в копии).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2012, 09:07     Vector ругается на использование классов E2397 и Invalid pointer operation
Еще ссылки по теме:

invalid pointer operation C++
C++ Invalid pointer operation
C++ Invalid floating point operation при работе с массивами

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

Или воспользуйтесь поиском по форуму:
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
03.04.2012, 09:07  [ТС]     Vector ругается на использование классов E2397 и Invalid pointer operation #14
Всем спасибо Подчеркнул для себя много важного и полезного!
Yandex
Объявления
03.04.2012, 09:07     Vector ругается на использование классов E2397 и Invalid pointer operation
Ответ Создать тему
Опции темы

Текущее время: 14:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru