我是C ++的新手,尽管之前我曾使用过C和Java。
在以下代码中,我:
为click事件定义一个处理程序,如果该对象存在,则只打印numpoints的值。如果没有,则创建它并将numpoints的值设置为0.
//defining polygon class
class polygon{
public:
int numpoints;
};
//create a global pointer that's uninitialized
static polygon *current = NULL;
//define a click handler.
void leftClick(int x, int y){
if (current==NULL){
polygon newpoly;
current = &newpoly;
current->numpoints = 0;
printf("created new polygon\n");
printf("%i points\n", (*current).numpoints);
}else{
printf("polygon exists\n");
printf("%i points\n", (*current).numpoints);
}
}
首次点击后,程序会打印
created new polygon
0 points
正如所料。但是,在第二次和随后的点击之后,它会打印
polygon exists
-1567658064 points
或其他一些看似随机的数字。谁知道这里发生了什么?为什么价值不能保持在0?任何帮助表示赞赏。
答案 0 :(得分:0)
这应该有效:
//defining polygon class
class polygon{
public:
int numpoints;
};
//create a global pointer that's uninitialized
static polygon *current = NULL;
polygon newpoly;
//define a click handler.
void leftClick(int x, int y){
if (current==NULL){
current = &newpoly;
current->numpoints = 0;
printf("created new polygon\n");
printf("%i points\n", (*current).numpoints);
}else{
printf("polygon exists\n");
printf("%i points\n", (*current).numpoints);
}
}
问题是newpoly
在第一个printf
之后被销毁,因为它超出了范围。您必须了解如何在C ++中管理内存。
答案 1 :(得分:0)
newpoly
是一个局部变量。你正在拿它的地址,但是它被立即销毁,所以地址不再有感觉了。
您可以做的是使用动态分配:current = new polygon;
。
如果您使用的是C ++ 11,则可以使用标题std::unique_ptr<polygon>
中的<memory>
。
结果是
static std::unique_ptr<polygon> current; // No need to set it to NULL
...
current.reset(new polygon);
此更改将确保您的分配在需要时正确delete
。