【问题标题】:Using a pointer member of a pointer member object as the argument of a function使用指针成员对象的指针成员作为函数的参数
【发布时间】:2014-08-26 12:32:34
【问题描述】:

基本上我想要的是一个可以访问 *b.x[i].var 的所有元素的函数(我是任意的,* 在那里,因为“var”本身就是一个指针)。

这在像普通指针这样的情况下是可能的

double * point = new double [N]

被类似的东西调用

double func (double * p){
  return p[2];
}

但似乎很难概括为类指针成员本身是具有指针成员的对象的情况,我一直无法找到如何正确执行此操作的解释(如果我没有正确命名,请原谅我- 这对我来说还是有点新鲜)。

更具体地说,我制作了一个简化的代码来说明这个问题:

class A {
public:
  double * var = new double;
};

class B {
  int N;
public:
  B (int, int);
  A * x = new A[N];
};

B::B (int d, int V) {
  N = d*V;
}

double func (double * a){
  return a[2];
}

int main () {

  int d = 3, V = 4;

  B b (d,V);

  *b.x[2].var = 1.2;

  cout << func(b.x.var) << "\n";

  return 0;
}

我曾希望输出为 1.2,但不出所料,它不会编译。令我震惊的是,函数中的 a[2] 以及 b.x.var 可能是错误的,但尽管我努力了,但我还是无法实现正确的语法。

最终我想将指针 var 概括为 double * var = new double [n],如果提供的任何解决方案也能在这种情况下工作,那就太好了。

作为替代方案,我尝试在函数中提供输入 A * a 并返回 *a[2].var,然后使用 func(bx) 调用该函数,但是在编译正常时它给出了“分段错误 11”。

最后我意识到我可以只使用一个(或没有)类,但这只是规避问题,而不是解决方案。

高度赞赏任何见解或解决方案。

【问题讨论】:

  • 我希望您意识到 A * x = new A[N]; 在未初始化时使用了 N
  • 另外,x[2] 返回一个指向A指针,所以它应该是 *(bx[2]->var) [对我来说更容易阅读一些...]
  • 您可以使用 std::vector 代替原始的拥有数组。
  • @Nim x[1] 不会返回指针,它会返回从 x 到索引 1 的 A 的引用
  • @chris 我没有。我也不知道它必须移动到构造函数才能正常工作。该问题现已修复 - 谢谢!

标签: c++ function class pointers member


【解决方案1】:

我不知道您要做什么,但这里有一些使用内联 cmets 编译并返回有效数据的东西:

#include <iostream>

using namespace std;

class A {
public:
  double * var = new double;
};

class B {
  int N;
public:
  B (int, int);
  A * x; // you can't initialize with N here
};

B::B (int d, int V) {
  N = d*V;
  x = new A[N]; // initialize here instead when N is defined
}

double func (A *a){
  int i = 0;
  return *(a[i].var);
}

int main () {

  int d = 3, V = 4;

  B b(d,V);

  //this value is accessed by func, make sure it has a value
  *(b.x[0].var) = 2.2;

  cout << func(b.x) << "\n";

  return 0;
}

编辑:在 OP 的 cmets 之后更新代码

【讨论】:

  • 感谢您更正 x 指针的初始化 - 没有意识到需要将其移至构造函数。该代码有效,但没有达到我的期望。基本上,我想要一个可以在函数内调用 b.x[i].var 的构造(仅在函数内指定 i,而不是在构造函数的参数中指定)。希望这能让意图更清晰?
  • 类似于当前状态?
  • 是的,该修复会起作用!但是在这里,您一路“退出”以使用 b 作为输入 - 为什么使用 b.x 不起作用? (之后我会将您的答案标记为已接受 - 不确定您是否可以在我接受它作为答案后更改代码)
  • 已更新以允许 b.x 成为您发送给 func 的内容,请注意它不接受指向 A 的指针,然后将该指针用作数组(其中将具有 d*V 实例。
【解决方案2】:

代码有很多问题:

class A {
    public:
      double * var = new double;
};  
  1. 什么是变量?
  2. 您不能像这样在类中初始化数据(使用构造函数)

【讨论】:

  • 1:我不明白这个问题。它是 A 类的指针类型成员,指的是双精度数?如果您的意思是值,那么我在*b.x[2].var = 1.2; 的一个实例中指定它? 2:谢谢。我并不认为这构成了初始化(因此属于构造函数)。编译时似乎没有弹出任何错误或警告(尽管我意识到这是正确的必要而非充分要求)。
猜你喜欢
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
相关资源
最近更新 更多