首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问std::vector类型的成员

如何访问std::vector类型的成员
EN

Stack Overflow用户
提问于 2015-11-24 11:02:59
回答 2查看 348关注 0票数 4

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

病媒声明:

代码语言:javascript
复制
class trilateration {
public:
    ...
    std::vector<tip> *potential;
    ...
};

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

代码语言:javascript
复制
trilateration::trilateration()
{
...
potential = new std::vector<tip>();
...
}

课堂技巧如下所示:

代码语言:javascript
复制
class tip {
public:

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

提示构造函数:

代码语言:javascript
复制
tip::tip(double x, double y)
{
pt = new Point2d(x,y);
sum=0;
}

对象以如下方式添加到向量中:

代码语言:javascript
复制
potential->push_back(tip1);

然后我想访问向量中的一些对象,如下所示:

代码语言:javascript
复制
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);
    }

}
}

在编译过程中,我得到了后续错误:

代码语言:javascript
复制
error: ‘class std::vector<tip>’ has no member named ‘sum’
error: ‘class std::vector<tip>’ has no member named ‘pt’

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

编辑:

在改变潜力成为三部曲的一员,pt成为tip的成员后,程序被编译,但当它遇到

代码语言:javascript
复制
potential.push_back(tip1);

投掷:

代码语言:javascript
复制
*** glibc detected *** ./loktest: malloc(): memory corruption: 0x00792f10 ***
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-24 12:37:04

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

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

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

代码语言:javascript
复制
class trilateration {
public:
    ...
    // WAS std::vector<tip> *potential;
    std::vector<tip> potential;
    ...
};

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

代码语言:javascript
复制
trilateration::trilateration()
{
    ...
    // REMOVED:
    // potential = new std::vector<tip>();
    ...
}

注意,在前面的代码中,当您用new分配向量时,必须在析构函数中正确地对其进行delete,并提供正确的复制操作(复制构造函数和副本分配),或者禁止对上述操作=delete进行标记。

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

tip类也是如此。

除非有充分理由拥有Point2d*数据成员,否则只需使用Point2d (非指针)数据成员:

代码语言:javascript
复制
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();
};

还更改构造函数:

代码语言:javascript
复制
tip::tip(double x, double y)
    : pt(x, y), sum(0)
{
  // REMOVE:
  // pt = new Point2d(x,y);
  //sum=0;
}

您的代码得到简化,您将避免一些bug和头痛。

票数 4
EN

Stack Overflow用户

发布于 2015-11-24 11:06:34

由于trilateration::potentialstd::vector<tip>*potential[i]是位于trilateration::potential + istd::vector<tip>。这不是你想要的。

代码语言:javascript
复制
for(int j=0; j<potential->size(); ++j)
{
    (*potential)[i].sum=potential[i].sum+normalize((*potential)[i].pt,(*potential)[j].pt);
}

可能是一次黑客攻击。但你真正想要的是摆脱那些无用的指点。让向量成为类的成员变量,在不需要的地方停止使用new

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33891909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档