C ++ векторный чтение ошибка нарушения доступа при создании уникального_птра для объектаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C ++ векторный чтение ошибка нарушения доступа при создании уникального_птра для объекта

Сообщение Anonymous »

Я получаю «Исключение: Читать нарушение доступа, _my_data было 0x4». Ошибка при попытке создать unqiue_ptr для объекта моего собственного класса. Я не понимаю, что этот код работал совершенно хорошо, пока я не начал внедрять государственную систему, чтобы лучше управлять потоком программы. Эта проблема, по -видимому, использует мой собственный класс. Я храню все экземпляры этих объектов в векторе, Delcared As So: < /p>
std::vector m_objectList;
< /code>
Все эти объекты имеют разные конструкторы, поэтому я добавляю объекты в список, как SO: < /p>
m_objectList.push_back(std::make_unique(newIndex, shipType, pos));
< /code>
В старом коде у меня был класс двигателя, в котором M_OBject -List был частным членом. В конструкторе для двигателя я назвал функцию, которая включала бы отталкивание 3 объектов, 2 корабля и солнце. Все было хорошо. M_OBjectList теперь является частным членом этого экземпляра StateFlight. Функция для добавления нового корабля является публичным членом StateFlight. Конструктор для StateFlight снова вызывает функцию добавить корабль. Но теперь это не может добавить, давая вышеупомянутую векторную ошибку. Я не уверен, что изменилось, так как все, что я сделал, это поместил еще один слой класса. > Старые фрагменты кода: < /p>
Конструктор для класса двигателя в main.cpp: < /p>
`Engine::Engine()
{
initEngine();

loadObjectData("sidewinder");
loadObjectData("cube");

for (int i = 0; i < m_objectLimit; i++)
{
m_indicesToUse.push(i);
}

addNewShipObject("sidewinder", sf::Vector3f{ 0, 0, 100 });
addNewShipObject("cube", sf::Vector3f{ -100, 0, 100 });
addNewSunObject(2000, sf::Vector3f{ -500, -500, 10000 });
}`
< /code>
и файл заголовка для двигателя, в main.h: < /p>
`class Engine
{
private:
sf::RenderWindow m_window;
sf::Clock deltaClock;

MathsManager m_mathsManager;

// object storage and limit management
const float m_objectLimit = 5;
std::queue m_indicesToUse;
std::vector m_objectList;

std::map m_inputs; // input handling will definitely change in time

sf::Vector3f m_deltaAngle{ 0, 0, 0 };
sf::Vector3f m_deltaPos{ 0, 0, 0 };

// =============================================== FUNCTIONS ================================================================================
void input(sf::Time dt);
void update(sf::Time dt);
void render();

// loading and initialisation functions
void initEngine();
void initInput();
void readSettings();
void loadObjectData(std::string objectName);

bool addNewShipObject(std::string shipType, sf::Vector3f pos); // tries to add a new ship object, returns true if succeeded, false if failed
bool addNewSunObject(int temp, sf::Vector3f pos); // tries to add a new sun object, returns true if succeeded, false if failed
void movePlayer(sf::Time dt);

public:
Engine();
void run();
};`
< /code>
и функция, чтобы добавить новый корабль: < /p>
`bool Engine::addNewShipObject(std::string shipType, sf::Vector3f pos)
{
bool successfulAdd = false;
if (m_indicesToUse.empty()) // if queue is empty (i.e. no more mover able to be assigned) then false (failed to add a new ship object)
{
std::cout
Это работает очень хорошо, я смог сделать все, как задумано, и просматривать корабль и солнце на экране. < /p>
Теперь новый код, который, который Имеет экземпляр двигателя и внутри этого, экземпляр Stateflight: < /p>
main.h:
`class Engine
{
private:
sf::RenderWindow m_window;
sf::View m_worldView; // due to the view, using javidx9's method I don't need to translate normalised position vectors
sf::Clock deltaClock;

// instances of the totally-not singleton classes
MathsManager m_mathsManager;
DebugInterface m_debugInterface;

// data loaded from files when the program starts
std::map m_engineSettings;
std::map m_objectMeshData;
std::map m_objectStats;

const float m_objectLimit = 5;

enum gameplayState {Flight, GalMap, SysInf, ShpSts, Inv, DckMen, ShpYrd, ComMkt, Outfit, Encyc, SpScrn, MnMenu}; // this will do for now
enum gameplayState m_gameplayState = gameplayState::Flight; // set to space flight to start off

StateFlight s_flight{ m_objectLimit, &m_moverSystem, &m_wireframeSystem, &m_mathsManager };
StateDocked s_docked{};

// input handling
std::map m_inputs; // input handling will definitely change in time

// =============================================== FUNCTIONS ================================================================================
void input(sf::Time dt);
void update(sf::Time dt);
void render();

// loading and initialisation functions
void initEngine();
void initInput();
void readSettings();
void loadObjectData(std::string objectName);
void calculateFPS(float dtAsSeconds);

public:
Engine();
void run();
};`
< /code>
Мой экземпляр Flightstate теперь создан. Сами штаты также наследуют от абстрактного базового класса, но в настоящее время хранятся и называются непосредственно, не помещаются в вектор или что -то в этом роде. Таким образом, файл заголовка для него в Stateflight.h выглядит следующим образом: < /p>
`class StateFlight : public stateTemplate
{
private:
// pointers
MoverSystem* p_moverSystem;
WireframeSystem* p_wireframeSystem;
//SunRendererSystem* p_sunRenderer;

MathsManager* p_mathsManager;

// object storage and limit management
std::queue m_indicesToUse;
std::vector m_objectList;

// below are temporary for testing why vector issue is happening
std::vector newShipList;
std::vector testList;
std::vector TEMP_intList;

public:
StateFlight(int objectLimit, MoverSystem* MS, WireframeSystem* WS, MathsManager* MM);
int update(sf::Time dt, std::map inputs);
void render(sf::RenderWindow& window);

bool addNewShipObject(std::string shipType, sf::Vector3f pos); // tries to add a new ship object, returns true if succeeded, false if failed
bool addNewSunObject(int temp, sf::Vector3f pos); // tries to add a new sun object, returns true if succeeded, false if faile

};`
< /code>
Конструктор для Stateflight: < /p>
`StateFlight::StateFlight(int objectLimit, MoverSystem* MS, WireframeSystem* WS, MathsManager* MM)
{
p_moverSystem = MS;
p_wireframeSystem = WS;
p_mathsManager = MM;

for (int i = 0; i < objectLimit; i++)
{
m_indicesToUse.push(i);
}

addNewShipObject("sidewinder", sf::Vector3f{ 0, 0, 100 });
addNewShipObject("cube", sf::Vector3f{ -100, 0, 100 });
//addNewSunObject(2000, sf::Vector3f{ -500, -500, 10000 }); // commented out while sun renderer is not being used for testing

}`
< /code>
и, наконец, функция AddNewship < /p>
bool StateFlight::addNewShipObject(std::string shipType, sf::Vector3f pos)
{
bool successfulAdd = false;
if (m_indicesToUse.empty()) // if queue is empty (i.e. no more objects able to be assigned) then false (failed to add a new ship object)
{
std::cout

Подробнее здесь: https://stackoverflow.com/questions/794 ... -to-object
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»