Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化具有指向另一个类的成员指针的类向量';成员变量_C++_Pointers - Fatal编程技术网

C++ 初始化具有指向另一个类的成员指针的类向量';成员变量

C++ 初始化具有指向另一个类的成员指针的类向量';成员变量,c++,pointers,C++,Pointers,对于科学代码,我需要构造需要指向其他类(即父类和同级)成员变量的(成员)指针的类 我已经研究了几个小时,发现了几个关于成员变量指针的主题,但没有关于我的具体问题。因此,我的问题是:在下面的示例中实例化类C的正确语法是什么,以便类C中的指针指向类B中的VectorXd beta Edit:为了澄清我的问题,预期的行为是调用B类成员函数PrintBetas()打印出VectorXd beta nr_C times的当前值 #include <iostream> #include <

对于科学代码,我需要构造需要指向其他类(即父类和同级)成员变量的(成员)指针的类

我已经研究了几个小时,发现了几个关于成员变量指针的主题,但没有关于我的具体问题。因此,我的问题是:在下面的示例中实例化类C的正确语法是什么,以便类C中的指针指向类B中的VectorXd beta

Edit:为了澄清我的问题,预期的行为是调用B类成员函数PrintBetas()打印出VectorXd beta nr_C times的当前值

#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();
  
}
#包括
#包括
#包括
使用名称空间特征;
使用名称空间std;
C类{
公众:
C(VectorXd*beta_-IN):beta(beta_-IN){}
void PrintBeta(){

cout在您的代码中,每当您复制一个B对象时,新B中的Cs仍然指向旧B中的beta成员。这是您想要解决的问题

选项1:仅使用B指针,封装在智能指针中,如或
共享\u ptr
。现在,当您复制时,它不会复制基础B对象,并且所有C都保持不变

选项2:复制B时,重载复制构造函数以调整所有基础C以指向新对象的beta成员:

B::B(const B& other)
  : beta(other.beta),
    vec(other.vec)
{
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        it->beta = &beta;
    }
}
这可能看起来很昂贵,但您仍在复制所有的Cs,因此不会改变时间复杂度。但是,您可能还希望重载移动构造函数,这是另一回事:

B::B(B&& other)
  : beta(std::move(other.beta)),
    vec(std::move(other.vec))
{
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        it->beta = &beta;
    }
}
现在,这将时间复杂度从可能的常量更改为可能的线性

注意:“指向成员变量的指针”与指向对象内部变量的指针不同,但两者在这里都没有多大用处。如果您有指向成员的指针,您可以像以下那样声明/定义它:

VectorXd B::* member_ptr = &B::beta;
您可以在类型为
b
的特定实例
b
上使用它,例如:

VectorXd val = b.*member_ptr;
。 如果您按照我上面介绍的方式定义
member\u ptr
,那么这一行的意思就是:

VectorXd val = b.beta;

.

正确的语法取决于您要做什么。我不想从有缺陷的代码中推断您的意图。(如果您的代码没有缺陷,您就不会问这个问题。)请描述您试图实现的目标。理想情况下,您的描述应该足够抽象,以至于在示例代码之前提及您的类层次结构只会成为一个附加的上下文。提示:描述可能会以“我想要
beta
指向…”开头。您确定:
需要(成员)指针
。这似乎是一个奇怪的用例。一种更标准的技术是使用
std::function
,然后它可以是任何类型的可调用函数,而不是特定的类型。@JaMiT:很好。在我的示例中,我希望C类中的beta指针指向B类中的beta向量,这样C类成员函数就可以将beta值打印到屏幕上。@Marzz有什么原因使得
C
中的指针必须指向
B
的一个成员吗?我想您正在设置使用a(另请参见)为什么不简单地使用指针,如在<代码> vcErrxD**/Cuth>?@ JAMIT:我研究了这个帖子,并且关于入侵列表的例子接近我所寻找的。唉,我仍然不能得到C中的指针指向B中的成员,因此这个问题。请让我知道,如果你知道这应该如何在C++中完成!或者成员指针,对于我的计算来说,这是C类中最优雅的设计。即使有另一种方法,我真的想知道如何用指向另一个类的成员变量的成员指针初始化一个类:)类B确实没有正确初始化C类中的指针。但是在解决方案方面,您如何支持我更改了C类构造函数和C类成员函数?我在可能需要更改的代码中添加了/?。不,我认为C类已正确实例化。只是B类的构造函数中没有实例化B类的成员变量vec。您需要添加vec()在初始化列表中。我不明白为什么这会解决问题?例如,如果我更改代码,使B类通过值将beta向量传递给C类,C类将beta存储为成员变量而不是指针,则beta值会正确打印。问题是,更新B类中的beta向量不会影响PrintBetas()成员函数的输出。请提供正确初始化类B的vec成员所需的语法。谢谢!您有以下行:
B(VectorXd beta_IN,int nr_C):beta(beta_IN){
。将其转换为:
B(VectorXd beta_IN,int nr_C):beta(beta_IN),vec(){
。您没有初始化vec()。我认为这通常会导致编译器警告,您可能应该打开这些警告。但是,我意识到还有另一个问题,即如果复制了B,那么新B中的Cs仍将指向旧B中的beta。我将很快编辑我的答案。我尝试了您建议的解决方案,但不起作用,即PrintBetas()函数仍然不会在屏幕上打印VectorXd beta值nr_C次。没错,您需要一个复制构造函数,但在我的例子中,类层次结构只初始化一次,之后没有更改,因此我尽可能地简化了示例。