Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在循环中创建结构的更好方法 我在C++中还没有编码过。最近,我正在努力做一些事情 涉及结构。像这样 typedef struct{ int x; int y; } Point;_C++_Pointers_Struct_Loops_New Operator - Fatal编程技术网

在循环中创建结构的更好方法 我在C++中还没有编码过。最近,我正在努力做一些事情 涉及结构。像这样 typedef struct{ int x; int y; } Point;

在循环中创建结构的更好方法 我在C++中还没有编码过。最近,我正在努力做一些事情 涉及结构。像这样 typedef struct{ int x; int y; } Point;,c++,pointers,struct,loops,new-operator,C++,Pointers,Struct,Loops,New Operator,然后在一个循环中,我试图创建新的结构,并将指向它们的指针放在一个列表中 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. }

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

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=循环内部的新点。 没有更好的语法吗?

当然可以:

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

你可能还想把你的列表中的点值列表,而不是指针,在这种情况下,你可以避免使用新的动态分配-总是在C++中尽可能避免的东西。

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

您可能还希望将列表值设为点值列表,而不是指针,在这种情况下,可以避免使用新的动态分配——在C++中总是可以避免的东西。

< P>结构是默认情况下的公共成员类,您甚至可以在结构中创建构造函数,并在循环中初始化point对象,如下所示:

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

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

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

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

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

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

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

我可以大胆猜测,您不太可能真的需要动态分配点之类的东西

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

list<Point> list;
list.append(Point(x, y));
列表;
追加(点(x,y));

我大胆猜测,您不太可能真的需要动态分配点之类的东西

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

list<Point> list;
list.append(Point(x, y));
列表;
追加(点(x,y));

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

例:

然后在某个地方:

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

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

例:

然后在某个地方:

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


哦谢谢你,尼尔!这样每次在循环中都会保留新的p?(抱歉,如果这看起来很愚蠢,我一直都是C)等等!我可以向结构添加方法?!哇!谢谢@桑德拉C在这方面是完全相同的。最好设想每次通过循环都会重新创建pa。结构和类在C++中基本上是一样的。正如Niel所说,你可以这样做:(条件){List.PopyBuffBead(点(i,j));}如果你不需要pointers@sandra结构基本上与类相同,只是默认情况下具有公共访问权限。是的,你可以添加构造函数、方法、析构函数等等,就像classesOh一样!谢谢你,尼尔!这样每次在循环中都会保留新的p?(抱歉,如果这看起来很愚蠢,我一直都是C)等等!我可以向结构添加方法?!哇!谢谢@桑德拉C在这方面是完全相同的。最好设想每次通过循环都会重新创建pa。结构和类在C++中基本上是一样的。正如Niel所说,你可以这样做:(条件){List.PopyBuffBead(点(i,j));}如果你不需要pointers@sandra结构基本上与类相同,只是默认情况下具有公共访问权限。所以,是的,你可以添加构造函数、方法、析构函数等等。就像classesThanks@Simon一样,@Niel的解决方案中的构造函数是必需的吗?当然可以。您必须显式声明构造函数,它不会自动完成。谢谢,Simon!事实上,这就是我在注释构造函数时发现的!:)谢谢@Simon,需要@Niel解决方案中的构造函数吗?当然需要。您必须显式声明构造函数,它不会自动完成。谢谢,Simon!事实上,这就是我在注释构造函数时发现的!:)为什么你会认为Point是一个基类?如果是的话,那就叫做形状,不是吗?这是荒谬的过度设计。为什么你会认为Point是一个基类?如果是的话,那就叫做形状,不是吗?这是荒谬的过度设计。