类和赋值运算符的数组

时间:2013-03-12 20:21:51

标签: c++ arrays

我是C ++的新手,我正在尝试做以下事情:

我有一个简单的类,叫做“sim”。我想创建一个包含类型为“sim”的10个元素的数组。所以我使用了sim** a = new sim*[10]

然后我跑了一圈,创建了像a[i]=new sim(i)这样的新元素。但是当我后来尝试打印每个a [i]的值(字段)时,我得不到我除了之外的东西。

以下是代码:

#include "stdafx.h"
#include <iostream>
using namespace std;

class sim{
private:
    int x;
    const int y;
public:
    sim();
    sim(int z);
    ~sim();
    void showInfo();
    sim& operator=(const sim& s);
};

sim::sim():y(10),x(0)
    {}

sim::sim(int z):y(10),x(z)
    {}

sim::~sim()
    {}

void sim::showInfo()
    {
    cout<<"x="<<x<<", y="<<y<<endl;
    }

sim& sim::operator=(const sim& s)
    {
    x=s.x;
    return *this;
    }

int _tmain(int argc, _TCHAR* argv[])
{
    sim** a = new sim*[10];
    for(int i=0;i<10;i++)
    {
        a[i]= new sim(i);
    }

    for(int i=0; i<10; i++)
        (*a)[i].showInfo();
    getchar();
    return 0;
}

这是错误的输出:

x=0, y=10
x=-33686019, y=-830047754
x=-33686019, y=-572662307
x=1869774733, y=201385040
x=725928, y=726248
x=1423328880, y=11
x=24, y=2
x=55, y=-33686019
x=4814584, y=-1
x=0, y=0

Y应始终为10,x应为0-9。 我究竟做错了什么? 谢谢!

2 个答案:

答案 0 :(得分:2)

问题是你的陈述中的操作顺序

(*a)[i].showInfo();

这是取消引用a,给你一个sim实例的指针,然后你正在索引它。相反,您应该索引到a,然后取消引用结果:

(*(a[i])).showInfo();

上面的括号是为了清楚起见。给定C ++运算符优先级,您可以安全地将该行写为:

(*a[i]).showInfo();

你奇怪的输出的原因是你正在索引你用new分配的第一个sim实例,它位于堆内存中的某个任意位置。您只是将后续的内存块视为sim实例,这会导致未定义的成员值。

答案 1 :(得分:2)

(*a)[i].showInfo();

这是不对的。这将产生与:

相同的输出
(*((*a) + i)).showInfo();

这显然不是你想要的。

您正在尝试访问存储在showInfo的第i个值指向的地址的对象的a方法。

所以你应该这样写:

(*(a[i])).showInfo();

然后你可以添加一些语法糖,这样你就没有那个糟糕的解引用操作符:

a[i]->showInfo();