无法关联类私有成员与友元函数,求维吉尼亚密码程序调试帮助
问题分析与修复步骤
1. 变量重复定义导致编译错误
在encode_string函数中,你先声明了size_t row, column, k;,随后在for循环里又定义size_t k = 0,属于重复定义变量,编译器会直接报错。修改方式:
// 原代码 size_t row, column, k; for (size_t k = 0; k < text.length(); k++) // 修改后 size_t row, column; for (size_t k = 0; k < text.length(); k++)
2. 修复头文件依赖关系
encode.cpp中包含的encode.h必须引入Vigenere_square.h,否则编译器无法识别Vigenere_square类的结构,友元函数也无法正确访问其私有成员。在encode.h中添加:
#pragma once #include "Vigenere_square.h" #include <string> std::string encode_string(const std::string& text, const std::string& key, const Vigenere_square& vs);
另外不建议在encode.cpp中直接用using namespace std;,改用std::前缀能避免命名冲突。
3. 类内成员初始化与内存管理
你的Vigenere_square类构造函数是空的,导致size和array未初始化,访问vs.array[row][column]会触发空指针崩溃,同时类内常量初始化需要确保编译器支持C++11及以上,或者移到构造函数中完成:
// Vigenere_square.h中修改成员声明 private: const std::string ALPHABET; size_t size; char** array; // 构造函数实现(Vigenere_square.cpp中) Vigenere_square::Vigenere_square() : ALPHABET("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") { size = ALPHABET.size(); // 分配二维数组内存并填充维吉尼亚方阵 array = new char*[size]; for (size_t i = 0; i < size; i++) { array[i] = new char[size]; for (size_t j = 0; j < size; j++) { array[i][j] = ALPHABET[(i + j) % size]; } } } // 析构函数释放内存 Vigenere_square::~Vigenere_square() { for (size_t i = 0; i < size; i++) { delete[] array[i]; } delete[] array; }
4. 优化密钥扩展逻辑
当前密钥扩展的循环条件会让key2长度超过文本长度,改成以下形式更合理:
while (key2.length() < text.length()) { key2 += key; }
5. 字符查找的边界判断
ALPHABET.find()找不到字符时会返回std::string::npos,这个值远大于vs.size,所以当前的if (row < vs.size && column < vs.size)能正确过滤非字母字符,这部分无需修改。
内容的提问来源于stack exchange,提问作者Митрон Игноревич
相关产品推荐
相关产品推荐

