You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法关联类私有成员与友元函数,求维吉尼亚密码程序调试帮助

问题分析与修复步骤

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,提问作者Митрон Игноревич

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:38:23