在 类 之间传递值
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 {
...
};
我正在尝试在两个 类:
之间传递值#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 {
...
};