指针的C ++帮助,特别是“ - >”操作者

时间:2012-10-22 17:36:05

标签: c++ pointers

大家好我有“ - >”的问题运营商。这是我的代码: 并OfferingPair * weeklySchedule ;Schedule类内部删除,并且在一个头文件中删除了OfferingPair。

struct     OfferingPair
{
  Offering     * off     ;
  OfferingPair * nextOff ;

}


Schedule::Schedule ()
{
    this->weeklySchedule=new OfferingPair[5];

    for(int i=0;i<5;i++)
    {
        weeklySchedule[i]->off=NULL;
        weeklySchedule[i]->nextOff=NULL;
    }   
}

因为:

weeklySchedule[i]->off=NULL;
weeklySchedule[i]->nextOff=NULL; 

行我得到一个错误,上面写着:

base operand of ‘->’ has non-pointer type ‘OfferingPair’

但是每周计划[i]是一个指针,为什么我不能使用“ - &gt;” ?。提前致谢。

3 个答案:

答案 0 :(得分:14)

weeklySchedule[i]返回对象本身,而不是指针,因此您必须使用.

weeklySchedule[i].off=NULL;
weeklySchedule[i].nextOff=NULL;

我建议您将代码修改为:

std::vector<OfferingPair> weeklySchedule

虽然。这是RAIIght(c)要做的事情。

答案 1 :(得分:0)

其他人已经指出了->与点(.)语法的问题。

但我想在其他方面详细说明。

由于您要将OfferingPair::offnextOff数据成员初始化为NULL,因此这项工作可能应在OfferingPair 默认构造函数中完成:

struct OfferingPair
{
  ....

  OfferingPair()
    : off(NULL)
    , nextOff(NULL)
  {
  }
};

您可以使用std::vector而不是原始C类数组来存储上述结构的实例。 将数据成员添加到Schedule类,如下所示:

  std::vector<OfferingPair> m_weeklySchedule;

然后在默认构造函数中创建一个包含5个项目的std::vector

Schedule::Schedule()
  : m_weeklySchedule(5)
{
}

请注意您的代码简化

另请注意,在析构函数中不需要显式delete[]来释放数组动态分配的内存:std::vector的析构函数将自动调用照顾好。

此外,编译器生成的复制构造函数和复制operator=将使用成员复制(调用相应的std::vector复制操作)做正确的事情,而不是原始C类数组你必须为复制构造函数和operator=编写适当的代码(或禁止它们,声明它们private)。

修改 您似乎已经编辑了原始帖子,添加了新代码,特别是OfferingPair数据结构的一些草图:

struct OfferingPair
{
  Offering     * off;
  OfferingPair * nextOff;
};

你有{em>指向OfferingPair内的下一个 OfferingPair的事实让我觉得你可能只需要Offering的链接列表?除非这是链接列表的学习练习,否则您可能需要std::list<Offering>或C ++ 11 std::forward_list<Offering>

答案 2 :(得分:0)

数组索引运算符基本上定义如下:

a[b] = *(a + (b))

->运算符基本上定义如下:

a->b = (*a).b

所以当你写:

weeklySchedule[i]->off=NULL;

你写的是:

(*(*(weeklySchedule + i))).off=NULL;

注意两次取消引用指针的方法。显然这是不正确的!