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

时间:2014-07-07 16:02:29

标签: c++ multidimensional-array constructor encapsulation private-members

我制作了一个程序,用于加密和解密利用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++;
            }           
        }               
    }
}

此表是程序运行的关键,没有理由对其进行更改。我尝试将其作为私人会员加入,但遇到了很多麻烦。我应该在构造函数中包含它,或者封装它的正确方法是什么?

3 个答案:

答案 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] = { ... };
...