在C++中,是否可以使用指针魔术同时修改多个结构对象


抱歉,这可能是一个愚蠢的问题,也可能是非常基本的问题。

我正在使用一个具有Rectangle结构的库,如下所示:

struct Rectangle {
int x;
int y;
int width;
int height;
}

我在std::vector<Rectangle>中有许多这样的矩形,它们总是具有彼此相同的x值(但所有其他变量都可能不同(。

有没有一种方法可以让我使用指针魔术创建一个变量cur_x,并让std::vector<Rectangle>中所有对象的x将其值更改为我将cur_x设置为的值?

结构是由库提供的,所以我不能修改它,并且我试图避免迭代std::vector<Rectangle>的所有元素来更改它们的x值。创建我自己的自定义结构也不是一个选项。

这听起来不像是你所设置的约束。我唯一能想到的(但这仍然是危险的,不是一个好主意IMO(是,如果你能以某种方式强制所有x变量在内存中是连续的,然后你可以用一些内存设置技巧同时设置它们。但考虑到您不能修改Rectangle结构,我不认为这是怎么可能的。

您的情况可以归结为您需要在多个位置设置内存,唯一的方法是设置多个(并且可能最好使用循环(

如果X值在向量中的所有元素中都是相同的,并且将保持这种状态,我能想到的最好的想法是对Rectangle结构的另一个副本进行typedef,并将int x更改为int* x,类似于这个

//Somewhere global-ish
typedef struct {
int* x;
int y, width, height;
} rectangle;
int cur_X = 10;
for (int i=0; i < rectangleVector.size(); i++){
rectangleVector[i].x = &cur_x;
}
std::cout << *rectangleVector[0].x << std::endl;

根据我在阅读其他评论后的理解,首先,您需要一次更改所有评论,其次,您不能使用指针。因此,我建议以不同的方式修改Rectange。

struct Rectangle {
static int x;
int y;
int width;
int height;
};

static关键字将确保所有Rectangle对象只分配一个内存空间,因此更改一次会将所有对象设置为相同的值。此外,由于成员x仍然是int,因此即使在重载之后,所有函数也将以相同的方式工作。(请确保没有任何函数正在创建矩形的临时副本或将x设置为临时值(。


要创建多组矩形,每个矩形都有自己的x,可以使用引用。引用将确保std::vector<Rectangle>中的所有矩形对象指向一个内存位置,同时允许两个不同向量之间的不同内存位置。

#include <iostream>
#include <vector>
struct Rectangle
{
int &x;
int y;
int width;
int height;
Rectangle(int &_x):x(_x){}
};
int main()
{
int cur_1 = 10;
int cur_2 = 20;
std::vector<Rectangle> Group_1(100, Rectangle(cur_1));
std::vector<Rectangle> Group_2(200, Rectangle(cur_2));

std::cout << Group_1[0].x << " " << Group_1[50].x << "n";
std::cout << Group_2[0].x << " " << Group_2[50].x << "n";
Group_1[0].x = 12;
Group_2[0].x = 14;
std::cout << Group_1[0].x << " " << Group_1[50].x << "n";
std::cout << Group_2[0].x << " " << Group_2[50].x << "n";
}

输出:

10 10
20 20
12 12
14 14

因此,如果您更改Group_1cur_1的任何元素的x,则Group_1的所有成员的x都将更改,但同时您可以为Group_2具有相同的属性,同时保留与Group_1不同的值。

最新更新