C ++连续检查对象变量值会产生不同的结果吗?

时间:2017-02-23 12:28:15

标签: c++

我是C ++的新手,尽管之前我曾使用过C和Java。

在以下代码中,我:

  • 定义多边形类。目前它只有1个变量:numpoints
  • 创建一个指向null
  • 的多边形对象的全局指针
  • 为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?任何帮助表示赞赏。

2 个答案:

答案 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