gpt4 book ai didi

c++ - 在 C++ 中设置和访问成员变量

转载 作者:行者123 更新时间:2023-11-28 03:46:28 24 4
gpt4 key购买 nike

我正在为 Xbox 360 编写一个开源项目,这是我第一次使用 C++,显然我做错了一些事情(很可能是很多事情)。

我目前的具体问题是我创建了一个类的许多实例,在构造函数中传入了对对象的引用,并为该对象设置了一个成员变量。

后来,当我访问这些对象时,成员变量中不包含我在构造函数中分配给它的对象。

此外,这些对象有一个 Update(float x, float y) 方法,在这个方法中我只是将 x 和 y 分配给成员变量 _x 和 _y。

当我稍后访问这些值时,它们是垃圾。

我将尝试在此处发布相关代码,但可能会遗漏某些内容,因此以防万一,这里有一个指向 github 项目的链接 Github - Xenu .

我指的类是 source/GUIApplicationPanel,它们的实例化/使用在 source/GUIManager 中。

这是我正在实例化许多实例的对象:

GUIApplicationPanel.H

class GUIApplicationPanel {
public:
GUIApplicationPanel(LibXenonApplication libXenonApplication);
void update(float x, float y);
void draw();

private:
LibXenonApplication application;
float _x, _y;
};

GUIApplicationPanel.CPP

GUIApplicationPanel::GUIApplicationPanel(LibXenonApplication libXenonApplication)
{
application = libXenonApplication;
}

void GUIApplicationPanel::update(float x, float y)
{
_x = x;
_y = y;
}

void GUIApplicationPanel::draw()
{
Draw::DrawColoredRect(_x, _y, 0.3f, 0.3f, ThemeManager::GetPanelColor());
}

这是创建它们的代码:

GUIManager.H

class GUIManager {
public:
void update(controller_data_s controller);

void draw();

private:
/* SNIP SNIP */

vector<GUIApplicationPanel> *currentPanels;

vector<GUIApplicationPanel> applicationPanels;
};

GUIManager.C

vector<LibXenonApplication> applications = LibXenonApplicationManager::GetApplications(applicationsPath);

// Create panels for applications
for(vector<LibXenonApplication>::iterator iter = applications.begin(); iter != applications.end(); ++iter) {
applicationPanels.push_back(GUIApplicationPanel(*iter));
}

这是更新它们的代码:

currentPanels = &applicationPanels;

// Render each screens worth of panels
for(int currentPass = 0; currentPass < renderPasses; currentPass++) {

horizontalOffset = currentPass * 1.0f;

for(int verticalPanel = 0; verticalPanel < verticalPanels; verticalPanel++) {

for(int horizontalPanel = 0; horizontalPanel < horizontalPanels; horizontalPanel++) {

// Make sure we haven't exceeded the amount of panels we're drawing...
if(panelIndex >= currentPanels->size()){break;}

// Get the panel at the current index
GUIApplicationPanel currentPanel = currentPanels->at(panelIndex);

// Calculate its position
float panelX = horizontalOffset + xStart + (horizontalPanel * panelWidth) + (horizontalPanel * panelGap);
float panelY = yStart + (verticalPanel * panelHeight) + (verticalPanel * panelGap);

// Update the panel
currentPanel.update(panelX, panelY);

// Move to the next panel...
panelIndex++;
}
}
}

最后是访问它们的值的代码:

for(vector<GUIApplicationPanel>::iterator iter = currentPanels->begin(); iter != currentPanels->end(); ++iter) {
iter->draw();
}

老实说,我完全没有想法 - 在构造函数以外的任何地方访问面板上的应用程序变量会导致它成为垃圾,同样使用 _x 和 _y(除了在更新方法中)。

我输入了一些登录信息,所以在面板的更新方法中会记录一行,记录设置后的 _x 和 _y 的值,以及显示应用程序的名称(显示为空白在日志中)。

调用 draw 方法时也会记录一行,显示 _x、_y 和应用程序的当前值:

Updating  to x -0.70 y 0.40
Updating to x -0.30 y 0.40
Updating to x 0.10 y 0.40
Updating to x 0.50 y 0.40
Updating to x 0.90 y 0.40
Updating to x -0.70 y 0.80
Updating to x -0.30 y 0.80
Updating to x 0.10 y 0.80
Updating to x 0.50 y 0.80
Drawing at x 0.00 y 0.00
Drawing at x 0.00 y 0.00
Drawing at x 0.00 y 0.00
Drawing at x 0.00 y 0.00
Drawing at x 0.00 y 0.00
Drawing at x 0.00 y 0.00
Drawing at x 0.00 y 0.00
Drawing at x 0.00 y 275577729171396449271808.00
Drawing at x 0.00 y 0.00

最佳答案

问题在于您访问 vector 中元素的方式:

GUIApplicationPanel currentPanel = currentPanels->at(panelIndex);

这会获得元素的拷贝,因此您设置拷贝的属性,而不是容器中保存的项目。获取引用,然后您可以修改容器中的项目..

编辑:根据评论,您已经意识到 std::vector<>::at()返回一个引用,所以你需要做的就是将上面的内容更改为一个引用,即

GUIApplicationPanel& currentPanel = currentPanels->at(panelIndex);

现在currentPanel 引用 GUIApplicationPanel 的实例在容器中的指定索引处。

关于c++ - 在 C++ 中设置和访问成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7469137/

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