将枚举指针传递给函数

4

我正在尝试将一个在函数之外声明的枚举传递给一个函数,以便更改函数内部的枚举值会更改指向的枚举值。在对象范围内仅使用枚举本身不是一个选项,因为我希望将此函数与多个不同的枚举实例一起使用。

我有一个名为'ColourState'的枚举。如下所示进行声明。和一个指向ColourState的指针。

enum ColourState {COLOUR1, COLOUR2};
ColourState* CS_GO_score;

指针是这样初始化的。
CS_GO_score = new ColourState;
*CS_GO_score = ColourState::COLOUR2;

我现在正在尝试将CSS_GO_score指向的ColourState传递给函数'pulsateColour'

就像这样。

void HUD::pulsateColour(GLfloat *colour1, GLfloat *colour2, GLfloat *objectCol, ColourState goingTo, int timeInFrames)
{
    GLfloat difference[4];
    //give us an array of values to change the array by in the alloted time
    difference[0] = (colour1[0]-colour2[0])/timeInFrames;
    difference[1] = (colour1[1]-colour2[1])/timeInFrames;
    difference[2] = (colour1[2]-colour2[2])/timeInFrames;
    difference[3] = (colour1[3]-colour2[3])/timeInFrames;

    //depending on the state, transform the array in one direction or another

    if(goingTo == ColourState::COLOUR2)//if we're moving toward colour 2
    {
        for(int i = 0; i<4; i++)
        {
        objectCol[i] -= difference[i];//subract the difference till we get there
        //we need to SNAP to the colour as we will not hit it every time using floats
            if( (objectCol[i]>(colour2[i]-(difference[i]*2))) && (objectCol[i]<(colour2[i]+(difference[i]*2)))  )
            {//if we hit this tiny but huuuge target
                objectCol[i] = colour2[i];//SNAP
            }

        }
    }else{
        if(goingTo == ColourState::COLOUR1)
        {
            for(int i = 0; i<4; i++)
            {
                objectCol[i] += difference[i];//add the difference till we get there
                //we need to SNAP to the colour as we will not hit it every time using floats
            if( (objectCol[i]>(colour1[i]-(difference[i]*2))) || (objectCol[i]<(colour1[i]+(difference[i]*2)))  )
            {//if we hit this tiny but huuuge target
                objectCol[i] = colour1[i];//SNAP
            }

            }
        }
    }

    if((objectCol[0] == colour1[0])&&(objectCol[1] == colour1[1])&&(objectCol[2] == colour1[2])&&(objectCol[3] == colour1[3]))
    {//if the objcolour == colour 1
        goingTo = ColourState::COLOUR2;//it's now time to move towards colour 2
    }else{
        if((objectCol[0] == colour2[0])&&(objectCol[1] == colour2[1])&&(objectCol[2] == colour2[2])&&(objectCol[3] == colour2[3]))
        {//if the objcolour == colour 2
            goingTo = ColourState::COLOUR1;//it's now time to move towards colour1  
        }

    }
}

这个函数的调用方式如下。

pulsateColour(white,blue, GO_scoreColour, *CS_GO_score, 10);

然而,当'goingTo'和'CS_GO_score'指针的值(它们应该是相同的地址,因此在技术上是相同的对象,对吧?)被观察时,在VS监视器中只看到了被'goingTo'指向的值(因为它是函数本地变量)发生了改变。我做错了什么?


所以你是一个反恐精英玩家;)谢谢你的问题,那对我很有帮助! - Alexandre Rozier
2个回答

7

你正在以值的方式传递枚举,因此该函数会拥有您传递的任何内容的本地副本。如果您想传递一个枚举并修改它的值,则建议按引用传递。

enum ColourState {COLOUR1, COLOUR2};

void change_colour(ColourState& c)
{
  c = COLOUR2;
}

....

ColourState cs = COLOUR1;
change_colour(cs);

再一次,互联网的智者们为我提供了帮助。谢谢! - Guy Joel McLean

1

然而,当指向'goingTo'和'CS_GO_score'的值的指针(它们应该是相同的地址,因此在技术上是相同的对象,对吗?)

不是这样的... 如果您传递指针本身,则它将是“相同的对象”。在这里,您正在传递指针指向的值。或者,您可能希望传递引用。

void HUD::pulsateColour(GLfloat *colour1, 
                        GLfloat *colour2, 
                        GLfloat *objectCol, 
                        ColourState goingTo, /* pass by value */
                        int timeInFrames)

...

我正在尝试将一个在函数范围外声明的枚举传递给一个函数,以便在函数内改变枚举的值会改变指向的枚举的值。您需要更改函数以接受指针或引用:
  ColourState *goingTo, /* pass direct the pointer */

或者

  ColourState &goingTo, /* pass a reference-dont need to change the body of the function */

我尝试传递指针本身,同时更改函数以接受指针而不是值。然而,在函数内部,我被告知赋值和布尔运算符(=和==)不能用于更改或比较值。例如,'*CS_GO_score == ColourState::COLOUR_2'。然而,通过引用传递已经起作用了。谢谢。 - Guy Joel McLean
当函数接收到 ColourState goingTo 时,goingTo == ColourState::COLOUR_2 是一个错误吗? - qPCR4vir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接