c++ - 按名称或索引引用成员变量

标签 c++ class reference

我正在编写一个简单的类来处理我正在制作的小型应用程序中的颜色。

此类将有 4 个 double 成员变量,并且希望能够通过名称(即:r、g、b 和 a)或索引(0 代表红色,1 代表绿色和等等)。

此外,如果能够使用大括号括起来的初始化列表进行初始化,那就太好了。

但是,我无法想出一种优雅简洁的方式来对此进行编码。

这是我最好的尝试,它并不漂亮。它也不处理无效索引。

struct Colour{
    double r, g, b, a;
    double& operator[](int i){
        switch(i){
        case 0:
            return r;
            break;
        case 1:
            return g;
            break;
        case 2:
            return b;
            break;
        case 3:
            return a;
            break;
        }
    }
    /* ... */
};
/* ... */
int main(){
    Colour c = {1.0, 2.0, 3.0, 4.0};
    std::cout << c.g << std::endl;
    c[1] = 10.0;
    std::cout << c.g << std::endl;
    return 0;
}

虽然这确实有效,但我想知道是否还有更多 (a) 优雅,并且 (b) 执行此操作的高性能(因为此应用程序主要处理像素操作)。

非常感谢。

最佳答案

我觉得你的代码很漂亮。它可以在 switch 语句中使用 default case。我喜欢您专注于为类用户创建灵活的工作流程,但通常在 C++ 中没有免费的午餐。如果你想要更多的选择,你的类(class)会更复杂。

但是,既然你问了。如果对您来说优雅意味着保持您的类定义简洁...

// C++'11
struct Colour
{
    double v[4];

    double& r = v[0];
    double& g = v[1];
    double& b = v[2];
    double& a = v[3];

    double& operator[](int i)
    {
        assert(i >= 0 && i < 4);  // #include <assert.h>
        return v[i];
    }
};


void test()
{
    Colour c{ 1.0, 2.0, 3.0, 4.0 };
    std::cout << c.b << std::endl;
}

我遇到的问题:

Colour c{ 1.0, 2.0, 3.0, 4.0, 5.0 };  // does not compile (good!)

double x = 5.0;
Colour c{ 1.0, 2.0, 3.0, 4.0, x };  // compiles (...bad)

顺便说一句,断言在 Debug模式下抛出一个有用的异常,但在 Release模式下编译时检查被删除(通过标志)。

如果是我,我会使用您的代码并添加边界检查。

对于性能,此时您唯一需要关心的就是不要使用低效算法。稍后,如果您完成了性能分析并且该类是瓶颈(大声笑),我们可以尝试对其进行优化。顺便说一句,代码简洁和优化不是 friend 。

关于c++ - 按名称或索引引用成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47857740/

相关文章:

c++ - 严格别名规则: static_cast vs reinterpret_cast

c++ - QT : webkit 中的未知模块

c# - 当您在另一个类中引用一个类时,实际发送/保存了多少数据?

swift - 之间有什么不同?和 ! Swift 中的弱引用和强引用

c++ - 对数组的引用,没有按预期工作

java - Java 引用和 C++ 引用有什么区别

c++ - 设置 C++ 中内置 exe 的 Windows 文件详细信息?

python - 我的 Py_NoneStruct 符号(python、boost.python)在哪里?

java - 如何获取数组来引用类

python - “子类”对象没有属性 'attribute_name'