C++指向另一个指针的指针

3

目前,我已经使我的两个对象指针工作起来了,例如:

Object * obj1;
Object * obj2;

obj2 = obj2;

如果我有这样的需求,该如何让它起作用?

Object * array[10][10];
Object * newarray[10][10];

我能否在不使用循环遍历元素的情况下将数组分配给新数组?

我问这个问题是因为我的主类中有这个数组。然后将其传递给子类以便对其进行操作,需要在新类中保存复制品以便子类函数可以访问它。

谢谢


3
好的,使用std::array。顺便说一下,如果它们管理内存,您可能要考虑切换到智能指针。 - chris
3
或许是std::uninitialized_fill - David G
@0x499602D2:你是指 std::uninitialized_copy,对吧?个人而言,我更喜欢在这里使用 std::copyuninitialized_copy 之所以能够工作,是因为我们在谈论平凡类型,但如果类型是非平凡的,我会更喜欢普通的 copy,因为它与你在处理非平凡类型时所做的操作一致。uninitialized_... 函数是用于特殊目的的,其中您正在尝试在未初始化的内存中构造对象。我们这里并不需要构造,我们需要赋值(虽然对于平凡类型,在优化后没有区别),这就是 std::copy 的作用。 - Benjamin Lindley
我能否在不使用for循环遍历元素的情况下将数组分配给新数组?不行,因为array[10][10]不是指针,它是一个指针的二维数组。 - AndersK
2个回答

4

Object * array[10][10];不是指向一个10x10对象数组的指针,而是一个由10x10个指向对象的指针组成的数组。

#include <iostream>
struct Object {};
Object * arr[10][10];
int main(int argc, const char* argv[])
{
    std::cout << "sizeof arr = " << sizeof(arr) << std::endl;
    return 0;
}

产生 arr1的大小为400

如果您想坚持C语言的行为,可以使用memcpy:

#include <iostream>
#include <string.h>

struct Object {};
Object * arr1[10][10];
Object * arr2[10][10];

...

memcpy(arr1, arr2, sizeof(arr1));

如果你想采用C++的方式,就像其他人所说的那样,可以看一下std::array或std::vector。


1
Kfsone的解决方案可以达到目的。以下示例代码说明了这一点。本来想在他的帖子下发布评论,但是代码会难以阅读。
#include<stdio.h>
#include<string.h>

int main()
{
    int *x1[2][2];
    int *x2[2][2];

    int a1 = 100;
    int b1 = 101;
    int c1 = 110;
    int d1 = 111;


    int a2 = 200;
    int b2 = 201;
    int c2 = 210;
    int d2 = 211;

    x1[0][0] = &a1;
    x1[0][1] = &b1;
    x1[1][0] = &c1;
    x1[1][1] = &d1;


    x2[0][0] = &a2;
    x2[0][1] = &b2;
    x2[1][0] = &c2;
    x2[1][1] = &d2;

    memcpy(x1,x2,sizeof(x2));
    printf("%d\n",*x1[1][1]);

    return 1;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接