我制作了一个程序,用于加密和解密利用2D表的文本短语。我有一个单独的类,它拥有密码所需的一切。但是,我在处理表时遇到了麻烦。我把它构造得还不错,但是我在课堂上把它封装起来时遇到了麻烦。我觉得它应该在创建一个对象时自动构建,但是现在我不得不通过main来调用它。
#include <iostream>
#include <string>
using namespace std;
class Cipher {
public:
Cipher();
Cipher(string key);
Cipher(string key, string message);
void buildTable(char table[][26]);
void newKey(string keyphrase);
void inputMessage();
string encipher(string message);
string decipher(string message);
string getPlainText() const;
string getCipherText() const;
private:
string key;
string plaintext;
string ciphertext;
};
。 。 。
void Cipher::buildTable(char table[][26]) {
char alphabet[26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o', 'p','q','r','s','t','u','v','w','x','y','z'};
int alphaIndex = 0;
for (int index1 = 0; index1 < 26; index1++) {
for (int index2 = 0; index2 < 26; index2++) {
if ((index1 + index2) < 26) {
alphaIndex = index1 + index2;
table[index1][index2] = alphabet[alphaIndex];
}
else
alphaIndex = 0;
while (((index1 + index2) > 25) && index2 < 26) {
table[index1][index2] = alphabet[alphaIndex];
index2++;
alphaIndex++;
}
}
}
}
此表是程序运行的关键,没有理由对其进行更改。我尝试将其作为私人会员加入,但遇到了很多麻烦。我应该在构造函数中包含它,或者封装它的正确方法是什么?
答案 0 :(得分:0)
你有“char table [] [26]”,我建议你把它作为你班级的私人成员。在构造函数中,您应该初始化它。你的“buildTable”成员函数不应该将数组作为参数,而应该初始化你的私有二维数组。通过查看你的代码,我没有看到为什么你应该把你的表放在“buildTable”函数的堆栈上。
答案 1 :(得分:0)
这看起来像初次使用初始化功能的作业。
class Cipher {
public:
// ...
private:
using table_type = char[26][26];
// Or for C++03 mode,
// typedef char table_type[26][26];
static void buildTable(table_type& table);
static const table_type& getTable();
// ...
}
const Cipher::table_type& Cipher::getTable() {
static table_type the_table;
if (the_table[0][0] == '\0')
buildTable(the_table);
return the_table;
}
答案 2 :(得分:0)
我更喜欢保留构造函数参数以输入最小类配置值。所以我会把它留作私人会员。至于值,我不明白为什么每次创建实例时重新计算它们,如果它们不会改变,你只需要计算它们一次并将它们硬编码到cpp文件中。
* .h文件:
class Cipher {
...
private:
...
static const int table[26][26];
};
* .cpp文件:
...
const int Cipher::table[26][26] = { ... };
...