现在有这样一个问题,描述如下:
类A、B有公有和私有类型、成员函数、成员数据,类C有些公有函数,怎样让类C的共有函数能随时访问类A、类B的所有成员?
问题具体说明如下:
class Class1 { public: int num_tokens; typedef vector<int> int_1vec; Class1() { cout << "class1 constructor!" << endl; } private: int config; }; class Class2 { public: int frame; Class2() { cout << "class2 constructor!" << endl; } private: int cur_cost; int next_cost; typedef vector<string> string_1vec; }; class Class3 { public: void* run(void*); private: int beam; }
怎样让类Class3的run函数能访问到Class1、Class2的所有成员,包括Class1的公有成员num_tokens、共有类型int_1vec,Class2的公有成员frame、私有类型string_1vec?
以下贴出两种方法来解决这个问题:
方法1: 将Class3声明为Class1和Class2的组合,也就是利用C++中的“组合机制”。
头文件代码如下:
#ifndef MULTI_CLASS_H #define MULTI_CLASS_H #include <vector> #include <string> #include <iostream> using namespace std; class Class3; // 必须先声明! class Class1 { // 声明为友元类,这样就可以直接在Class3中使用Class1的私有类型了 // 如果没有此声明,则只能访问Class1的公有部分 friend class Class3; public: int num_tokens; typedef vector<int> int_1vec; Class1() { cout << "class1 constructor!" << endl; } private: int config; }; class Class2 { friend class Class3; // 同上 public: int frame; Class2() { cout << "class2 constructor!" << endl; } private: int cur_cost; int next_cost; typedef vector<string> string_1vec; }; class Class3 { public: Class3() { cout << "class3 constructor!" << endl; } void print(); private: Class1 obj1; Class2 obj2; }; #endif /* MULTI_CLASS_H */
源文件定义如下:
#include "multi-class.h" void Class3::print() { cout << "obj1 beam is: " << obj1.num_tokens << endl; Class1::int_1vec int_vec; // 使用Class1的公有类型 for (int i = 0; i < 10; ++i) int_vec.push_back(i); for (int i = 0; i < 10; ++i) cout << int_vec[i] << " "; cout << endl; Class2::string_1vec string_vec; // 使用Class2的私有类型 for (int i=0; i<10; ++i) { string tmp = "hello"; string_vec.push_back(tmp); } for (int i=0; i<10; ++i) cout << string_vec[i] << " "; cout << endl; };
主函数的简单测试如下:
#include <cstdlib> #include "multi-class.h" using namespace std; int main(int argc, char** argv) { Class3 class3; class3.print(); return 0; }
输出结果如下:
class1 constructor! class2 constructor! class3 constructor! obj1 beam is: 0 0 1 2 3 4 5 6 7 8 9 hello hello hello hello hello
从结果也能看到“组合”类中构造函数的调用顺序。
方法2:Class3同时继承基类Class1和基类Class2,也即C++中的“多继承”机制。
头文件如下:
#ifndef MULTI_CLASS_H #define MULTI_CLASS_H #include <vector> #include <string> #include <iostream> using namespace std; class Class3; // 此处同样需要友元声明 class Class1 { friend class Class3; public: int num_tokens; typedef vector<int> int_1vec; Class1() { cout << "class1 constructor!" << endl; } private: int config; }; class Class2 { friend class Class3; public: int frame; Class2() { cout << "class2 constructor!" << endl; } private: int cur_cost; int next_cost; typedef vector<string> string_1vec; }; class Class3: public Class1, public Class2 { // 多继承的写法 public: Class3() { cout << "class3 constructor!" << endl; } void print(); private: int i; }; #endif /* MULTI_CLASS_H */
源文件定义如下:
#include "multi-class.h" void Class3::print() { cout << "obj1 beam is: " << num_tokens << endl; // 注意这里就是num_tokens! int_1vec int_vec; // 对Class1公有成员的直接继承,不需要 Class1:: 域作用符 for (int i = 0; i < 10; ++i) int_vec.push_back(i); for (int i = 0; i < 5; ++i) cout << int_vec[i] << " "; cout << endl; string_1vec string_vec; // 对Class2私有类型的直接继承 for (int i=0; i<5; ++i) { string tmp = "hello"; string_vec.push_back(tmp); } for (int i=0; i<5; ++i) cout << string_vec[i] << " "; cout << endl; };
主函数的调用和方法1的一致,结果也与方法1一致,略。
关于C++中‘‘友元"的简单介绍,可参见博客:
http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.html
时间: 2024-10-21 15:35:12