如何访问类型为std :: vector

时间:2015-11-24 11:02:59

标签: c++ pointers vector

我的程序有一个计算一些总和的函数,为此我需要访问vector中对象的属性:

向量声明:

class trilateration {
public:
    ...
    std::vector<tip> *potential;
    ...
};

然后在构造函数中初始化:

trilateration::trilateration()
{
...
potential = new std::vector<tip>();
...
}

课程提示如下:

class tip {
public:

double sum;
Point2d *pt;
tip();
tip(double x, double y);
virtual ~tip();
};

tip构造函数:

tip::tip(double x, double y)
{
pt = new Point2d(x,y);
sum=0;
}
在某些函数中将

对象添加到向量中:

potential->push_back(tip1);

然后我想访问矢量中的一些对象:

void trilateration::get3points()
{

for(int i=0; i<potential->size(); ++i)
{
    for(int j=0; j<potential->size(); ++j)
    {
        potential[i].sum=potential[i].sum+normalize(potential[i].pt,potential[j].pt);
    }

}
}

编译时遇到以下错误:

error: ‘class std::vector<tip>’ has no member named ‘sum’
error: ‘class std::vector<tip>’ has no member named ‘pt’

我如何从矢量中获取这些属性?

修改

在改变成为三边会员的潜力后,将pt作为小费的成员,程序编译但遇到时

potential.push_back(tip1);

抛出:

*** glibc detected *** ./loktest: malloc(): memory corruption: 0x00792f10 ***

2 个答案:

答案 0 :(得分:4)

除非有理由拥有指针数据成员并使用new在堆上分配对象,否则不要这样做。

您的代码似乎使用了一种Java风格,但这是 C ++ ,而不是Java。享受C ++的自动资源管理,以及C ++析构函数的强大功能。只需定义数据成员而不使用指针和动态分配。

在课程trilateration中,从vector<tip>*更改为vector<tip>

class trilateration {
public:
    ...
    // WAS std::vector<tip> *potential;
    std::vector<tip> potential;
    ...
};

trilateration的构造函数中,您不需要动态创建向量;只需删除使用new分配向量的行:

trilateration::trilateration()
{
    ...
    // REMOVED:
    // potential = new std::vector<tip>();
    ...
}

请注意,在您之前的代码中,当您使用new分配向量时,您必须在析构函数中正确delete,并提供正确的复制操作(复制构造函数和复制赋值),或者禁止标记上述操作=delete

相反,如果你有一个普通的简单非指针数据成员,你就不需要所有这些复杂的东西。

您的tip课程也是如此 除非有充分理由拥有Point2d*数据成员,否则只需使用Point2d(非指针)数据成员:

class tip {
public:

  double sum;

  // WAS: Point2d *pt;
  Point2d pt; // <-- note: no pointers here

  tip();
  tip(double x, double y);

  // NOTE: Do you really need a virtual destructor here?? 
  virtual ~tip();
};

也改变构造函数:

tip::tip(double x, double y)
    : pt(x, y), sum(0)
{
  // REMOVE:
  // pt = new Point2d(x,y);
  //sum=0;
}

您的代码变得简单,并且您将避免一些错误和麻烦。

答案 1 :(得分:3)

由于trilateration::potentialstd::vector<tip>*potential[i]是位于std::vector<tip>的{​​{1}}。这不是你想要的。

trilateration::potential + i

可能是黑客攻击。但是你真正想要的是摆脱所有那些无用的指针。使向量成为类的成员变量,并在不需要的地方停止使用for(int j=0; j<potential->size(); ++j) { (*potential)[i].sum=potential[i].sum+normalize((*potential)[i].pt,(*potential)[j].pt); }