gpt4 book ai didi

C++ 空指针

转载 作者:行者123 更新时间:2023-11-30 02:36:08 28 4
gpt4 key购买 nike

所以我是 C++ 的新手,我正在尝试使用这样的内部类:

struct PreviousButton {
SelectionScreen* ss;

PreviousButton(SelectionScreen* sss) {
ss = sss;
}

void ClickAction() {
//images is a vector with images. in here it is empty
ss->images;
}
};

这个内部类在 SelectionScreen 类中,我需要执行一个点击操作,并且需要一些 selectionscreen 的变量。

选择屏幕:

class SelectionScreen {
public:
void AddImage(Image img);
std::vector<Image> images;

我如何填充 vector :

Image* image = new Image{ };
AddImage(*image2);

添加图片方法:

void SelectionScreen::AddImage(Image img)
{
images.push_back(img);
}

但是当我尝试在类中使用选择屏幕时,所有变量都是空的。但是当我查看选择屏幕时,所有变量都已设置。

我通过 SelectionScreen 的方式:

PreviousButton* previousButton = new PreviousButton(*ren, this);

SelectionScreen 是如何初始化的:(这个方法是从 main 调用的)

int Program::Render() {
bool quit = false;
MenuScreen m = SelectionScreen{ Sdl_Renderer };
// change current screen to selectionscreen
ScreenController::GetInstance().ChangeMenu(m);

while (!quit) {
// handle user input and repaint
}

// delete all windows if quit is true
SDL_DestroyRenderer(Sdl_Renderer);
SDL_DestroyWindow(Sdl_Window);
SDL_Quit();
return 0;
}

有谁知道为什么我的变量是空的?

最佳答案

这并没有解决您描述的直接问题,但您这里有一个严重的问题:

  ss->currentImageIndex = ss->images.capacity() - 1;

images.capacity() - 1 不能保证将有效索引返回到您的 vector 中。您应该使用 images.size() - 1

std::vector::capacity() 告诉您当前为 vector 分配的存储空间,而不是它实际包含的元素数。

更新

当您像这样将 SelectionScreen 分配给 MenuScreen

MenuScreen m = SelectionScreen{ Sdl_Renderer }; 

您“切片”SelectionScreen 对象(参见 What is object slicing? )。

这一行创建了一个新的 MenuScreen 对象,m,通过从一个临时的 SelectionScreen 对象复制构建它。新的 MenuScreen 对象 m 不是 SelectionScreen。它也是与在此表达式右侧创建的临时 SelectionScreen 完全不同的对象。

你的 PreviousButton,我假设它是在 SelectionScreen 的构造函数中创建的,它包含一个指向临时 SelectionScreen 的指针,编译器是此行完成后可自由删除。

要解决此问题,您可以改用此初始化:

MenuScreen& m = SelectionScreen{ Sdl_Renderer };

在这种情况下,m 是对您的(临时)SelectionScreen 的引用 - 这很好,因为 (a) 引用是多态的,所以它仍然知道它确实是一个 SelectionScreen,而不仅仅是一个 MenuScreen 并且 (b) 它是对在右侧创建的完全相同的 SelectionScreen 对象的引用,您的 PreviousButton 有一个指向的指针。我现在也将“临时”位括起来,因为对临时文件进行本地引用可以保证只要引用存在,它就会存在(参见例如 Does a const reference prolong the life of a temporary?)。

请注意,我在这里假设您仅在随后的 while (!quit) 循环中使用此 SelectionScreen,即可以安全地删除屏幕此 int Program::Render() 方法结束。

关于C++ 空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33077665/

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