使用指针访问对象数组

时间:2012-02-29 16:30:31

标签: c++ object pointers

这是我的示例程序

#include "stdafx.h"

class B
{
public:
    int i,j;
};

class A
{
public:
    B b[2];
    A()
    {
        b[0].i = 1;
        b[0].j = 2;
        b[1].i = 3;
        b[1].j = 4;
    }
    B* function()
    {
        return b;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    B* obj = new B();
    obj = a.function();
    return 0;
}

我必须得到b个对象的数组(即需要所有值,b [0] .i,b [0] .j,b [1] .i和b [1] .j)

但是当我尝试使用此代码时,只返回一个对象。

3 个答案:

答案 0 :(得分:1)

你在问题​​中陈述的不是真的。确实返回了两个对象。使用obj[0]obj[1]访问它们。

我猜你在调试器下面看obj,IDE无法知道你的指针obj是两个对象的数组。因此,工具提示只会显示第一个对象obj[0]*obj。但另一个对象obj[1]肯定存在。

在调用a.function后添加以下行:

printf("%d, %d, %d, %d\n", obj[0].i, obj[0].j, obj[1].i, obj[1].j);

你会看到这个输出:

1, 2, 3, 4

请注意,B* obj = new B();行没有任何意义,因为您会立即覆盖obj。你应该这样做:

B* obj = a.function();

您的代码也有点危险,因为您必须至少保持a活着,只要您引用obj

答案 1 :(得分:1)

此代码

B* function()
        {
          return b;
        }

返回指向数组

的第一个元素的指针
B b[2];

可以使用指针算术和/或运算符[]来取消引用。

答案 2 :(得分:1)

是的,你实际上正在返回一个指向数组b [2]的指针。你现在要做的是迭代该指针中的项目。您可以通过在代码中添加以下行来打印它们:

A a;
B *obj = a.function();
std::cout << obj[0].i << ", " << obj[0].j << "; " << obj[1].i << ", " << obj[1].j << std::endl;

当然,包括文件开头的iostream:

#include <iostream>