C ++类构造函数参数:如何在不复制的情况下从另一个类实例访问成员和方法?

时间:2015-07-13 15:18:12

标签: c++ eclipse class constructor

我有两个班级AB。在A中,我有一些成员和一些方法,例如

标头文件:

A.hpp:

    class A {   
      public:
        A(int i);
        virtual ~A();
        int j;
        Eigen::Vector3d e;
        void printE();
    }

B.hpp:

class B
{
  public:
      B(A* A_ptr);
      virtual ~B();
      void doSomething();
  private:
      A * object;
};

源文件:

A.cpp:

#include <iostream>
#include "A.hpp"
using namespace Eigen;
using namespace std;

A::A(int i)
{
  j = i;
}
A::~A()
{
}
A::printE()
{
  cout<<"e = ("<<this->e(0)<<","<<this->e(1)<<","<<this->e(2)<<")"<<endl;
}

B.cpp:

#include <iostream>
#include "A.hpp"
#include "B.hpp"
using namespace Eigen;
using namespace std;

B::B(const A * A_ptr)
{
  object = A_ptr;
}
B::~B()
{
}
B::doSomething()
{
  int a = 2*object->j+object->e(1); // very stupid and simple example
}  

}

在课程B中,我想访问成员以及A实例的方法,而不复制任何内容。我考虑将指向A的实例的指针传递给B的构造函数,并访问所需的成员和方法。

上面的代码只是我问题的抽象,但我希望你明白我的观点。 我的代码编译得很好(我使用Eclipse Luna),除非我尝试创建类B的实例

#include "A.hpp"
#include "B.hpp"
using namespace Eigen;
using namespace std;

int main(int argc, char **argv)
{
  A A_instance(n);

  A* A_ptr;
  A_ptr = &A_instance;
  B B_instance(A_ptr); // commenting this line, the code compiles fine

  return 0;
}

编译此代码时,Eclipse会输出以下错误:

Errors (3 items)
    make: *** [all] Error 2
    make[1]: *** [some_path.dir/all] Error 2
    make[2]: *** [some_other_path] Error 1

,遗憾的是对我没什么帮助。

我的问题是:哪种方法最好?使用朋友类或继承可能更好吗? (注意A进行B所需的一些计算,但是否则它们不相关。)或者在{{1}的构造函数中将指针作为参数传递时,我做错了什么}?

1 个答案:

答案 0 :(得分:1)

void doSomethingB(A_ptr->a);

这不是有效的成员函数声明,也不是定义。

您可能想写

void doSomethingB() {
    A_ptr->a; // what do you want to do with it?
}