在 类 之间传递值

Passing value between classes

我正在尝试在两个 类:

之间传递值
#ifndef classa_inc
#define classa_inc

#include "classb.hpp"

class classa {
    private:
        int a;
        classb tmp;
    public:
        classa(int);
        classa ();
        int get_a() const;
        int get_b() const;
};

#endif

// ..

#include "classa.hpp"

classa::classa (int _a) : a(_a), tmp(30) {}
classa::classa () : a(20), tmp(30) {}

int classa::get_a () const {
    return a;
}

int classa::get_b () const {
    return tmp->get_b ();
}

// ..

#ifndef classb_inc
#define classb_inc

#include "classa.hpp"

class classa;

class classb {
    private:
        classa *ca;
        int b;
    public:
        classb (int);
        classb (classa *);
        int get_b () const;
};

#endif

// ..

#include "classb.hpp"

classb::classb (int _b) : b(_b) {}

classb::classb (classa *ca) {
    b = ca->get_a ();
}

int classb::get_b () const {
    return b;
}

// ...
#include <iostream>
#include "classa.hpp"
#include "classb.hpp"

int main () {
    classa a(10);
    classa a1; // 20
    classb b(&a1); // pass 20
    std::cout << a.get_a() << std::endl; // 10
    std::cout << a.get_b() << std::endl; // 30
    std::cout << b.get_b() << std::endl; // 20
    return 0;
}

我已经阅读了一些关于该主题的博客和教程,我想问问你们这样做是否正确,或者是否有其他方法或解决方法,因为我遇到了错误:

classa.hpp:9:3: 错误:'classb' no nombra a un tipo

类似 classb 的东西没有命名类型...有什么想法吗?

在classb.hpp中,classa的前向声明就足够了(class classa;)。您不需要包括 classa.hpp。包含它会造成循环依赖:classb.hpp包含classa.hpp,也包含classb.hpp等

所以:

#ifndef classb_inc
#define classb_inc

//#include "classa.hpp" -> not ok and useless

class classa; // => ok

classa.hpp 需要包含在 classb.cpp 中,因为它需要了解其实现。

#include "classb.hpp"
#include "classa.hpp" 

classb::classb (int _b) : b(_b) {}

classb::classb (classa *ca) {
    b = ca->get_a (); //needs to know if classa indeed has a get_a() method
}

int classb::get_b () const {
    return b;
}

这些更改使代码编译成功。

你的classb.cpp

#include "classb.hpp"

...

编译器展开 #include 宏,并插入 classb.hpp:

#ifndef classb_inc
#define classb_inc

#include "classa.hpp"
...
class classb {
...
};
#endif

...

扩展新的 #include 宏,并插入 classa.hpp:

#ifndef classb_inc
#define classb_inc

#ifndef classa_inc
#define classa_inc

#include "classb.hpp"

...
classb tmp;
...
#endif

class classb {
...
};
...
#endif

...

编译器展开that #include宏,并再次插入classb.hpp

#ifndef classb_inc
#define classb_inc  <--

#ifndef classa_inc
#define classa_inc

#ifndef classb_inc  <--
...
#endif

...
classb tmp;  <--
...
#endif

class classb {
...
};
...
#endif

...

注意两条标记线;第一个定义了 classb_inc,所以第二个省略了 #endif 之前的所有内容。这是 include-guard 的正确行为。但是现在在第三个标记行之前没有 classb 的定义,编译器抱怨它不知道 classb 是什么。

解决方法:classb.hpp不需要包含classa.hpp

#ifndef classb_inc
#define classb_inc

//#include "classa.hpp"

class classa;

class classb {
...
};