gpt4 book ai didi

c++ - 我从指针得到一个未初始化的对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:41:42 25 4
gpt4 key购买 nike

所以我在获取使用 SFML 形状的指针时遇到了一些麻烦。我不确定它是否与 SFML 有关,或者我是否做错了什么。

在 Draw() 中,x(a ControlWindow) 不包含有效值,它仅显示“???”,如此处所示。但是 m_controls(map) 包含控制对象的正确值。

我是 C++ 的新手,所以非常感谢任何帮助。

异常

Exception thrown at 0x60B26EE5 (sfml-graphics-2.dll) in OokiiUI.exe: 0xC0000005: Access violation reading location 0x00000000.

主要内容

vector<WindowControl> windowControls;

void Draw ();

int main ()
{
RectangleShape rect(Vector2f(120,120));
WindowControl windowControl(nullptr,0);
Control testControl(&windowControl,1);

testControl.SetShape(&rect);

windowControl.AddControl(testControl);
windowControls.push_back(windowControl);


return 0;
}

窗口控件

class WindowControl : Control
{
public:
WindowControl ( WindowControl * windowControl, uint64_t uint64 )
: Control ( windowControl, uint64 )
{
}

void AddControl(Control control)
{
m_controls.insert_or_assign(control.GetId(), control);
m_controlPtrs.push_back(&control);
}

vector<Control*>* GetControls()
{
return &m_controlPtrs;
}

private:
map<uint64_t, Control> m_controls;
vector<Control*> m_controlPtrs;
};

绘制

for (auto x : windowControls)
{
vector<Control*> *controlPtrs = x.GetControls();
window->draw(x.GetControl(0)->GetShape());
}

最佳答案

这里有个问题:

void AddControl(Control control)
{
m_controls.insert_or_assign(control.GetId(), control);
m_controlPtrs.push_back(&control);
}

您添加参数 control 的地址,该地址在函数结束时被销毁。看起来您想像这样添加您添加到 mapcopy 的地址:

void AddControl(Control control)
{
m_controls.insert_or_assign(control.GetId(), control);
// don't use the parameter here, use the copy you put in the map
m_controlPtrs.push_back(&m_controls[control.GetId()]);
}

尽管这并不理想,因为如果您发送相同的 control 两次,它只会在 map (已更新)中出现 一次两次 在指针 vector 中。您可以使用 insert_or_update 返回的 pait 来解决这个问题:

void AddControl(Control control)
{
auto [iter, was_inserted] = m_controls.insert_or_assign(control.GetId(), control);

// only add to vector if it was not in the map before
if(was_inserted)
m_controlPtrs.push_back(&iter->second);
}

旁注:

在这种情况下返回一个引用比返回一个指针更为惯用:

vector<Control*>& GetControls()
{
return m_controlPtrs;
}

这也破坏了封装,因此可能值得考虑如何避免如此直接地访问对象的内部。

关于c++ - 我从指针得到一个未初始化的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48697611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com