我正在编写一个程序,用于加密和解密使用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++;
}
}
}
}
这个表是程序运行的关键,没有理由改变它。我试着把它作为一个私人会员,但遇到了很多麻烦。我应该在构造函数中包含它吗,或者封装它的正确方法是什么?
您拥有的"char table[][26]",我建议将其作为类的私有成员。在构造函数中应该初始化它。你的"buildTable"成员函数不应该把数组作为参数,而是应该初始化你的私有二维数组。通过查看你的代码,我看不出你为什么要把你的表放在"buildTable"函数的堆栈上。
这看起来像是首次使用时初始化函数的作业。
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] == ' ')
buildTable(the_table);
return the_table;
}
我倾向于将构造函数参数留给最小类配置值。所以我会把它作为私人会员。至于值,我不明白为什么每次创建实例时都要重新计算它们,如果它们不会改变,您只需要计算一次并将它们硬编码到cpp文件中。
*.h文件:class Cipher {
...
private:
...
static const int table[26][26];
};
*.cpp文件:
...
const int Cipher::table[26][26] = { ... };
...