LINUX.ORG.RU

Массив в классе и странности

 , ,


0

2

Всем привет. Давно не писал на C++, захотелось вспомнить этот язык. Накатал следующий класс.

plane.hpp

class Plane
{
    public:
        Plane(int planetype);
        float *bodyx;
};

plane.cpp

#include "plane.hpp"
float bx[][6] = {{0, -5, -6, 0, 6, 5}, {1, 1, 1}};

Plane::Plane(int planetype)
{
    cout << sizeof(bx[planetype]) << " " << sizeof(bx[planetype][0]) << " " << sizeof(bx[planetype]) / sizeof(bx[planetype][0]) << endl;
    for(unsigned int k=0; k<sizeof(bx[planetype])/sizeof(bx[planetype][0]); k++)
    {
        bodyx[k] = bx[planetype][k];
        cout << bodyx[k] << " ";
    }
    cout << endl;
}

main.cpp

#include "plane.hpp"
int main(int argc, char* args[])
{
    Plane* player = new Plane(0);
    cout << sizeof(player->bodyx) << " " <<  sizeof(player->bodyx[0]) << " " << sizeof(player->bodyx) / sizeof(player->bodyx[0]) << endl;
    for(unsigned int k=0; k<sizeof(player->bodyx)/sizeof(player->bodyx[0]); k++)
    {
        cout << player->bodyx[k] << " ";
    }
    cout << endl;
}

Вывод:

24 4 6
0 -5 -6 0 6 5 
8 4 2
0 -5 
Ошибка сегментирования (стек памяти сброшен на диск)

То есть в конструкторе в массив благополучно перешли все 6 значений. А куда же по дороге делись 4 из них и что я делаю не так?

Ответ на: комментарий от al_exquemelin

тем более что пишут, можно делать так при необходимости

Емнип стандарт не гарантирует валидность итераторов и указателей для вектора. Так делать попросту нельзя. Но главный вопрос - зачем?

Dudraug ★★★★★
()
Ответ на: комментарий от al_exquemelin

А что мне остаётся, если внешней функции нужны const Sint16 *, а у меня вместо них два вектора? Придётся как-то переходить от одного к другому.

Ну для однопоточного приложения, когда у тебя идет вызов функции где принимаются указатели, то можно. Хранить их (указатели) для дальнейшего использования «потом» не стоит.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Да ладно, я уже написал через data(). Ну, как написал. Ещё не дописал до самого интересного места, скажем так. В классе у меня сейчас vector<Sint16> bodyx, а когда нужно, пишу bodyx.data().

al_exquemelin ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.