【问题标题】:C++ calling a vector of classes' method in another classC++ 在另一个类中调用类的方法向量
【发布时间】:2015-05-22 12:47:08
【问题描述】:
class C {
  public: void c_set(int x){ a = x; }
  private: int a;
}
;
 class U {
  public: void load();
         c_loader(int i, int x){ c[i].c_set(x); };
  private: vector<C> c(20);
}
;
 void U::load() {
  int x;
  cin >> x >> i;
  c_loader(i, x)
}

我真的对这个感到困惑。我需要在另一个中调用成员函数,但我的问题是内部类是该类的向量。我的代码应该可以工作,但结果是段错误。假设函数cget有定义。

【问题讨论】:

  • 最后一行 a 假设为 x。
  • load应该是U的方法吗?
  • load() 可以像public: void load() { ... } 一样内联(即在类内部)声明,或者您必须将类名称添加到函数名称前,例如void U::load() { ... }x 未初始化。最后c 为空(当您尝试访问其成员时会导致段错误)。
  • @James - 首先像其他人提到的那样编辑代码。 x 的初始值是多少?在访问它之前,您需要将一些 C 实例添加到向量中。
  • 对不起,我在上面的代码中犯了一个错误。最后一行必须定义为类 U 方法,作为一个有两个参数的函数;一个索引(因为我想访问所有向量的元素)并且该值将被保留。另一点是,通过这个过程,我想更改 C 类字段之一的值

标签: c++


【解决方案1】:

这个问题有点不清楚,但试试这个可以防止段错误。

class C {
  public: void cget(int a);
  private: int a;
};

class U {
  public: void load();

  vector<C> c;    // Note: c is made public in order to add elements from main
};

 void U::load(unsigned x, int a) {
  if (x < c.size())   // Check the size of c _before_ access
  {
    c[x].cget(a);
  }
}

void main()
{
  U u;
  C c;
  u.c.push_back(c);
  u.load(0, 3);  // Will end up calling cget
  u.load(1, 3);  // Will just return without calling cget
}

编辑: 只想提一下,问题中的代码在我的回答中发生了很大变化。这就解释了为什么我的代码看起来完全不同;-) 无论如何,答案仍然是:在访问之前检查 c 的大小。

【讨论】:

  • 我想我找到了问题所在。段错误的原因是我没有初始化这个块中的向量。对代码中的问题感到抱歉。 ;-)
猜你喜欢
  • 2019-08-11
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多