小编dev*_*ter的帖子

在C++中使用类似枚举的数据

我正在更新一段旧的C++代码,并且遇到了设计问题,需要有关最佳行动方案的建议.代码处理几何数据.目前,代码定义了许多处理元素类型的全局常量:

#define TETRAHEDRON 0
#define HEXAHEDRON 1
Run Code Online (Sandbox Code Playgroud)

每个常量都有与之相关的信息,这些信息保持不变,并且当前由一个类处理,在我们的拓扑中.

int Topology::nodesPerElement(int topType)
{    
    switch(topType) {
        case TETRAHEDRON:
            return 4;
            break;
        case HEXAHEDRON:
            return 8;
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

拓扑类具有许多这些功能,只需打开全局常量即可找出相关信息.有许多元素类型,并且switch语句引入了许多错误,这些错误不考虑所有元素类型.如果添加了元素类型,则需要修复所有这些方法.我需要一种更好的方法来保持关联信息的类型.

枚举是对此设计的改进,但它没有解决将数据与枚举相关联的问题.

为简单起见,我想避免为每种类型实例化类,因为每个类都只包含不会改变的静态数据.

我真正需要的是一个"静态类",它保存这些信息并执行如下的伪代码:

class Tetrahedron : public TopType {
    static const int nodesPerElement = 4;
    static const std::string name = "Tet";
    etc...
}
Run Code Online (Sandbox Code Playgroud)

拓扑中的每个方法都变得微不足道:

int Topology::nodesPerElement(TopType topType)
{
    return topType.nodesPerElement;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在C++中执行此操作?我已经考虑过删除枚举并为每个拓扑类型分别设置子拓扑类,但我从其他人那里得到的反馈是,它太复杂了.我希望我的问题足够清楚.

c++ enums

3
推荐指数
1
解决办法
403
查看次数

为什么这样做?在C++中返回const引用

我正在使用C++和const引用,并且很困惑为什么这段代码有效:

#include <iostream>

class A {
public:
    A() : a_(50) {}
    const int& getA() const { return a_; }
private:
    const int a_;
};

int main(int argc, char* argv[])
{
    A* a = new A();
    const int& var = a->getA();
    std::cout << var << std::endl;
    delete a;
    std::cout << var << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

结果:

50
50
Run Code Online (Sandbox Code Playgroud)

这是我的想法:

var存储对a_的引用.
删除a时,也应删除a_.
当再次访问var时,它不再包含有效的引用,并且应该发生分段错误.

为什么这样做?我不相信我是临时副本.

c++ const const-reference

1
推荐指数
1
解决办法
334
查看次数

标签 统计

c++ ×2

const ×1

const-reference ×1

enums ×1