C++跨类访问类内Vector为空问题排查求助
问题原因与解决方案
核心错误
你在b::check()函数里新建了一个abc mlj对象,这个对象和main()中已经通过seta()添加过元素的vkk是完全独立的实例——每个abc对象都有自己的私有words向量,mlj的words从未被初始化添加元素,自然是空的,所以无法访问到vkk里的内容。
另外你的代码还有一个小bug:check()的while循环里没有重新调用word_check()更新w的值,会导致一旦输入错误就陷入死循环,这个需要一并修正。
解决方法
下面提供两种常用的修复思路:
方法1:传递abc对象的引用给b::check()
让b的check()函数接收一个已初始化的abc对象的引用,直接使用这个对象的word_check()方法:
class b{ private: vector<string> valid; public: // 修改函数参数,接收abc对象的引用 void check(abc& target) { string k; cout << "Enter word to check: "; cin >> k; bool w = target.word_check(k); while(w == false) { cerr << "invalid input, try again: "; cin.clear(); cin.ignore(INT_MAX, '\n'); cin >> k; w = target.word_check(k); // 新增:重新检查更新w的值 } valid.push_back(k); } }; // main函数中调用时传入已初始化的vkk int main() { abc vkk; vkk.seta(); vkk.seta(); vkk.seta(); b pla; pla.check(vkk); // 传递vkk的引用 }
方法2:将abc的words设为静态成员(适合全局共享词库场景)
如果你的业务场景中所有abc对象需要共享同一个词库,可以把words设为静态私有成员,对应的成员函数也改为静态:
class abc{ private: static vector<string> words; // 静态成员,所有abc实例共享 public: static void seta() { // 静态成员函数 string s; cout << "word: "; cin >> s; words.push_back(s); } static bool word_check(string a) { // 静态成员函数 for(string b : words) { if(b == a) { return true; } } return false; } }; // 必须在类外部初始化静态成员 vector<string> abc::words; class b{ private: vector<string> valid; public: void check() { string k; cout << "Enter word to check: "; cin >> k; bool w = abc::word_check(k); // 直接调用静态成员函数 while(w == false) { cerr << "invalid input, try again: "; cin.clear(); cin.ignore(INT_MAX, '\n'); cin >> k; w = abc::word_check(k); // 重新检查更新w的值 } valid.push_back(k); } }; int main() { abc::seta(); // 直接调用静态成员函数,无需创建对象 abc::seta(); abc::seta(); b pla; pla.check(); }
内容的提问来源于stack exchange,提问作者jania
相关产品推荐
相关产品推荐

