循环使用引用数组的类成员(C ++)

时间:2012-04-23 16:09:06

标签: c++ arrays class reference member

我想循环使用一组相同类型的成员。这是一个有时有效的解决方案,有时不会:

#include <iostream>
#include <vector>
class Test{
   public:
      Test():xmin(0),ymin(0),xmax(0),ymax(0),acs((vector<int> (&)[4])xmin){};
      vector<int> xmin,ymin,xmax,ymax;
      vector<int> (&acs)[4];
};
int main(){
   Test t;
   t.xmin.push_back(2);
   cout << t.xmin.size() << "=!=" <<t.acs[0].size() << endl;
}

以上测试代码适合我。在一个更大的程序中,我现在做的不是,即t.ymin似乎与t.acs [1]不一样,依此类推。 上述结构一般是有意义的还是我应该完全不同?

提前致谢, 托马斯

3 个答案:

答案 0 :(得分:2)

您可以使用指向成员的指针数组。这种方式可能是最快的(对你来说似乎很重要),但有点模糊,你必须第二次提到你的成员变量列表。

#include <iostream>
#include <vector>

struct Test
{
    std::vector<int> xmin,ymin,xmax,ymax;

    std::vector<int>& GetByIndex(int index)
    {
        typedef std::vector<int> Test::*ptr_to_member; // typedef makes syntax less crazy

        static const ptr_to_member pointers[4] = {
            &Test::xmin, &Test::ymin, &Test::xmax, &Test::ymax
        };

        return this->*pointers[index];
    }
};

int main(){
    Test t;
    t.xmin.push_back(2);
    std::cout << t.xmin.size() << "=!=" << t.GetByIndex(0).size() << '\n';
}

如果您不需要速度,一个非常简单的解决方案涉及一个开关:

std::vector<int>& GetByIndex(int index)
{
    switch (index) {
    case 0: return xmin;
    case 1: return ymin;
    case 2: return xmax;
    case 3: return ymax;
    default: abort();
    }
}

答案 1 :(得分:0)

Mike Seymour - 绝对正确 - 你的解决方案很危险。

尝试注入以下内容:

class Test
{
    struct AllArrays
    {
        vector<int> * vec1, .... * vecN;
    };
    union 
    { 
        AllArrays _as_fields;
        vector<int> * _as_Array[];
    } _allTogether;
};

你需要编写一点点长限定符的有效负载:

Test t;
t._allTogether._as_fields.vec1

答案 2 :(得分:0)

这是非常糟糕的做法。特别是,您需要依赖padding详细信息。无法保证编译器将在没有任何填充的情况下布局数据成员。如果表示数组,则使用数组。我的2c ......