【发布时间】:2020-10-20 00:05:00
【问题描述】:
对于科学代码,我需要构建需要(成员)指向其他类(即父级和兄弟级)成员变量的指针的类。
我已经研究了几个小时,发现了几个关于指向成员变量的指针的主题,但没有关于我的具体问题。因此我的问题是:在下面的示例中实例化类 C 以使类 C 中的指针指向类 B 中的 VectorXd beta 的正确语法是什么?
编辑:为了澄清我的问题,预期的行为是调用 B 类成员函数 PrintBetas() 打印出 VectorXd beta nr_C 次的当前值。
#include <iostream>
#include <vector>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
class C {
public:
C( VectorXd *beta_IN ): beta( beta_IN ) {}
void PrintBeta() {
cout << "(*beta) = " << (*beta).transpose() << endl; // ???
}
private:
const VectorXd *beta;
};
class B {
public:
B( VectorXd beta_IN, int nr_C ): beta( beta_IN ) {
for( auto i=0; i<nr_C; i++)
vec.push_back( C( &beta ) );
}
void PrintBetas() {
for (auto c : vec)
c.PrintBeta();
}
VectorXd beta;
private:
vector<C> vec;
};
class A {
public:
A( int nr_B, int nr_C ) {
for (auto i=0; i<nr_B; i++) {
VectorXd beta = VectorXd::Random(3);
subclass.push_back( B( beta, nr_C) );
}
}
vector<B> subclass;
};
int main() {
A test(2,3);
test.subclass[0].PrintBetas();
test.subclass[1].beta.setZero();
test.subclass[1].PrintBetas();
}
【问题讨论】:
-
正确的语法取决于你想要做什么。我宁愿不要试图从有缺陷的代码中推断出你的意图。 (如果您的代码没有缺陷,您就不会问这个问题。)请描述您要完成的工作。理想情况下,您的描述将足够抽象,以至于提及您的类层次结构只是在示例代码之前添加的一些上下文。 提示:描述可能以“我希望
beta指向...”开头。 -
您确定:
that require (member) pointers。这似乎是一个奇怪的用例。更标准的技术是使用std::function<int()>然后它可以是任何类型的可调用而不是特定类型。 -
@JaMiT:好点。在我的示例中,我希望 C 类中的 beta 指针指向 B 类中的 beta 向量,因此 C 类成员函数可以将 beta 值打印到屏幕。
-
@Marzz
C中的指针是否有原因必须 指向B的成员?我认为您正在设置自己使用pointer to class data member(另请参阅cppreference.com),但为什么不简单地使用指针,如VectorXd*? -
@JaMiT:我研究了那篇文章,关于侵入性列表的示例与我所寻找的非常接近。唉,我仍然无法让 C 中的指针指向 B 中的成员,因此这个问题。如果您知道应该如何在 C++ 中完成,请告诉我!至于成员指针的原因,在我的计算中,这是 C 类中最优雅的设计。即使有另一种方法,我真的很想知道如何使用指向另一个类的成员变量的成员指针来初始化一个类:)