如何将数组作为私有类成员并确保适当的封装?



我正在编写一个程序,用于加密和解密使用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] = { ... };
...

相关内容

  • 没有找到相关文章

最新更新