【问题标题】:a nicer way to create structs in a loop在循环中创建结构的更好方法
【发布时间】:2010-05-10 09:48:52
【问题描述】:

我已经很久没有用 C++ 编写代码了。最近,我正在尝试做一些事情 涉及结构。像这样

typedef struct{
    int x;
    int y;
} Point;

然后在一个循环中,我尝试创建新结构并将指向它们的指针放入列表中。

Point* p;
int i, j;
while (condition){
    // compute values for i and j with some function...
    p = new Point;
    p* = {i, j}; //initialize my struct.
    list.append(p); //append this pointer to my list. 
} 

现在,我的问题是可以简化吗?我是说指针 循环外的变量 *p 并在循环内调用 p = new Point。 没有更好/更好的语法吗?

【问题讨论】:

    标签: c++ pointers struct loops new-operator


    【解决方案1】:

    当然:

    Point * p  = new Point;
    

    你可能还应该给你的 Point 类一个构造函数:

    struct Point {      // note no need for typedef
        int x;
        int y;
        Point( int ax, int ay ) : x( ax ), y( ay ) {}
    };
    

    这样你就可以说:

    Point * p  = new Point( i, j );
    

    您可能还希望将您的列表设为 Point 值的列表,而不是指针,在这种情况下,您可以避免使用 new 动态分配 - 在 C++ 中总是要尽可能避免。

    【讨论】:

    • 哦!谢谢,尼尔!那么这将在循环内每次保留新的 p 吗? (对不起,如果它看起来很愚蠢,我一直主要做 C)
    • 等等!我可以向结构添加方法?!哇!谢谢!
    • @sandra C 在这方面完全一样。最好考虑每次循环都重新创建 pa 。而结构体和类在 C++ 中基本上是一回事。
    • 正如 Niel 所说,您可以这样做: while( condition ) { list.push_back( Point( i,j ) ); } 如果你不需要指针
    • @sandra 结构本质上与类相同——只是默认情况下具有公共访问权限。所以是的,你可以像类一样添加构造函数、方法、析构函数等
    【解决方案2】:

    结构可以有如下构造函数:

    struct Point{
        Point(int ax, int ay):x(ax), y(ay){}
        int x;
        int y;
    };
    

    然后函数可以如下所示:

    int i, j;
    while (condition)
    {
        list.append(new Point(i,j));
    } 
    

    【讨论】:

      【解决方案3】:

      由于默认情况下结构是具有公共成员的类,因此您甚至可以在结构中创建一个构造函数并在循环中初始化您的点对象,如下所示:

      Point* p = new Point(i,j);
      

      【讨论】:

      • 谢谢@Simon,需要@Niel 解决方案中的构造函数吗?
      • 当然可以。您必须显式声明构造函数,它不会自动完成。
      • 谢谢,西蒙!事实上,这就是我通过注释掉构造函数发现的! :)
      【解决方案4】:

      我敢猜测,您真的需要动态分配点之类的东西是极不可能的。

      您很可能希望添加构造函数并按值存储它们:

      list<Point> list;
      list.append(Point(x, y));
      

      【讨论】:

        【解决方案5】:

        我推荐工厂方法。假设“Point”将是许多对象的基类,您可以拥有一个返回指针的“Factory”。

        例如:

        struct Point
        {
                Point(int mx, int my):x(mx),y(my) {}
                int x;
                int y;
        };
        
        // Circle, Polygon, etc.
        
        class Factory
        {
        public:
                static Point *getPoint(int mx, int my) { return new Point(mx, my); }
        // Circle, Polygon, etc
        };
        

        然后在某处的代码中:

        while(cond)
        {
         list.append(Factory::getPoint(i, j));
        }
        

        【讨论】:

        • 你为什么认为 Point 是一个基类?如果是的话,它会被称为Shape,不是吗?这是可笑的过度设计。
        猜你喜欢
        • 1970-01-01
        • 2020-09-22
        • 2019-03-21
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 2019-04-17
        • 1970-01-01
        相关资源
        最近更新 更多