【问题标题】:Reference Loop C++参考循环 C++
【发布时间】:2021-09-27 01:07:43
【问题描述】:

我有一个类Color,我想定义一个此类的常量,并在类中使用该常量。所以代码可能是这样的:

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 无法定义,因为它们使用的是不完整类型。我尝试通过将 const 放置在类 decloration 下方来解决此问题。

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 引用了一个未知值。

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

或者还有其他我想念的方法吗?

【问题讨论】:

  • 黑白应该是指针吗?您正在使用 new,这意味着是的,但它们没有被定义为指针 ...
  • 他们不应该是指针,更新了问题
  • 你可以有黑色和白色的静态 const 成员。此外,您刚刚所做的更改是内存泄漏。你不应该在这里使用new。
  • 255*3/2 应该非常接近。四舍五入到最接近的整数,但仍然...382 相当不错。
  • 没关系,那是我的错。我刚刚看到3/2 并认为你犯了一个错误。你所拥有的是合理的。

标签: c++ reference constants


【解决方案1】:

这里不需要内存分配。您所需要的只是向前声明您的常量颜色,并向前声明您的班级以便能够完成第一步。您还需要一个公共构造函数,以及至少一些公共方法。

这一切都给你:

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);

【讨论】:

    【解决方案2】:

    这样可以使您的类界面更易于阅读。 大多数时候,我们还是希望将实际函数移到源文件中。

        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;
        }
    

    我也会添加比较运算符。

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      相关资源
      最近更新 更多