参考循环 C++

Reference Loop C++

我有一个classColor,我想定义一个这样的常量class,并在class中使用那个常量。所以代码可能如下所示:

class Color;

const Color BLACK = *new Color(0, 0, 0);
const Color WHITE = *new Color(255, 255, 255);

class Color {
    const int r;
    const int g;
    const int b;

    Color CloserBlackOrWhite() {
        int rgb = r + g + b;
        return rgb > (255*3/2) ? BLACK : WHITE;
    }
}

当然,问题在于 BLACK/WHITE 无法定义,因为它们使用的是不完整类型。我尝试通过将常量放在 class 声明下方来解决这个问题。

class Color {
    const int r;
    const int g;
    const int b;

    Color CloserBlackOrWhite() {
        int rgb = r + g + b;
        return rgb > (255*3/2) ? BLACK : WHITE;
    }
}

const Color BLACK = *new Color(0, 0, 0);
const Color WHITE = *new Color(255, 255, 255);

除了现在 CloserBlackOrWhite 正在引用一个未知值。

那么,有没有办法在 class 声明之前声明常量?

或者还有其他我所缺少的方法吗?

这里不需要内存分配。您只需要转发声明您的常量颜色,并转发声明您的 class 即可完成第一步。您还需要一个 public 构造函数,以及至少一些 public 方法。

这一切给你:

class Color;

extern const Color BLACK;
extern const Color WHITE;

class Color {
    const int r;
    const int g;
    const int b;

    public:
    Color(int r, int g, int b):r(r), g(g), b(b)
    {
    }

    Color CloserBlackOrWhite() {
        int rgb = r + g + b;
        return rgb > (255*3/2) ? BLACK : WHITE;
    }
};

const Color BLACK = Color(0, 0, 0);
const Color WHITE = Color(255, 255, 255);

这有效并使您的 class 界面更易于阅读。 无论如何,大多数时候我们都希望将实际函数移动到源文件中。

    class Color {
      protected:
        const int r;
        const int g;
        const int b;

        public:
        Color(int r, int g, int b):r(r), g(g), b(b)
        {
        }

        Color CloserBlackOrWhite();
        };

    const Color BLACK = Color(0, 0, 0);
    const Color WHITE = Color(255, 255, 255);

    Color Color::CloserBlackOrWhite() {
        int rgb = r + g + b;
        return rgb > (255*3/2) ? BLACK : WHITE;
    }

我还会添加比较运算符。