一种在循环中创建结构的更好方法

时间:2010-05-10 09:48:53

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

我已经很久没用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。 是不是有更好/更好的语法?

5 个答案:

答案 0 :(得分:10)

不确定

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 ++中尽可能避免使用。

答案 1 :(得分:5)

struct可以有一个构造函数,如:

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

我猜想你真的需要动态地分配像Point这样的东西。

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

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

答案 4 :(得分:0)

我推荐工厂方法。假设“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));
}