2010-05-10 51 views
0

我还没有用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。 对此没有更好/更好的语法吗?

回答

10

肯定的:

Point * p = new 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值的列表,而不是指针,在这种情况下,你可以避免使用ne的动态分配w - 总是在C++中尽可能地避免。

+1

哦!谢谢,尼尔!那么每次都会在循环中保留新的p? (对不起,如果它看起来很愚蠢,我一直以C为主) – sandra 2010-05-10 09:52:35

+1

等待!我可以添加一个方法到一个结构?!哇!谢谢! – sandra 2010-05-10 09:54:29

+0

@sandra C在这方面完全一样。最好考虑每次通过循环重新创建pa s。结构和类在C++中基本上是一样的。 – 2010-05-10 09:55:12

2

由于结构是由默认的公共成员的类,你甚至可以创建结构内的构造函数和循环这样的内初始化点对象:

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

谢谢@Simon,是@Niel解决方案中的构造函数吗? – sandra 2010-05-10 10:00:52

+0

当然可以。你必须显式声明构造函数,它不会自动完成。 – Simon 2010-05-10 10:30:28

+0

谢谢,西蒙!事实上,这正是我通过注释构造函数而发现的! :) – sandra 2010-05-10 10:33:37

5

的结构可以有这样一个构造函数:

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

谢谢@Akanksh! :) – sandra 2010-05-10 10:14:47

1

我会冒险猜测,你真的不太需要动态地分配类似Point的东西。

您很可能希望通过值增加一个构造函数,并将其储存:

list<Point> list; 
list.append(Point(x, y)); 
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)); 
} 
+0

为什么你会认为Point是基类?如果是的话,它会被称为形状,不是吗?这是荒谬的过度设计。 – 2010-05-10 12:27:53

相关问题