C++类间如何实现数据继承?子类如何访问父类2d vector及优化构造?
问题分析与解决方案
现有代码的核心问题
- 你代码中创建的
A s和B c是完全独立的两个实例,B对象内部持有的父类A子对象是单独初始化的,完全没有用到s中加载好的data,所以B的构造函数读取到的data永远是空的 - 你定义
B时使用的是默认私有继承,虽然当前data是A的public成员,B内部可以访问,但如果需要在类外访问A的成员,需要改为public继承 - 你为了让
B的默认构造函数能通过编译,额外添加了A的空默认构造,这属于无意义的冗余代码,完全可以通过构造函数初始化列表规避
最优实现方案(继承场景)
直接把文件名参数透传给B的构造函数,在初始化列表调用A的带参构造,不需要额外写A的空默认构造,也不需要单独创建A实例:
#include <iostream> #include <vector> #include <fstream> #include <string> using namespace std; class A { public: vector<vector<string>> data; fstream file; string word; // 移除无意义的空默认构造 explicit A(string fileOpen) { file.open(fileOpen); while (file >> word) { vector<string> rowTemp = {word}; data.push_back(rowTemp); } } vector<vector<string>> getVector() { return data; } }; // 可根据需求调整为private继承,不影响B内部访问data class B : public A { public: // 构造函数初始化列表调用A的带参构造,不需要A的默认构造 explicit B(string fileOpen) : A(std::move(fileOpen)) { // 直接访问父类的data for (auto &i : data) { for (auto &j : i) { cout << j << ' '; } cout << endl; } } // 后续可以直接在B里编写逻辑处理data void processData() { // 自定义处理逻辑 } }; int main(int argc, char* argv[]){ if (argc < 2) return 1; // 直接创建B实例,传入文件名即可,不需要单独创建A B c(argv[1]); c.processData(); return 0; }
特殊场景:需要复用已有的A实例
如果你已经提前创建好了A的实例,希望B复用它的data,可以给B加一个接收A实例的构造函数,这种场景更推荐用组合而非继承:
class B { public: vector<vector<string>>& data; explicit B(A& a_obj) : data(a_obj.data) { // 打印逻辑和原有逻辑保持一致即可 } }; // main中用法: A s(argv[1]); B c(s);
内容的提问来源于stack exchange,提问作者alex deralu
相关产品推荐
相关产品推荐

