Классы как параметр функции c ++ - PullRequest
1 голос
/ 05 июня 2011

Я написал несколько криптоалгоритмов в виде классов, и теперь я хочу реализовать режимы шифрования (обобщенные режимы, показанные в Википедии, а не конкретные в спецификациях алгоритмов). Как бы я написал функцию, которая может принимать любой из классов?

редактирование:

вот что я хочу сделать

class mode{
  private:
    algorithm_class

  public:
    mode(Algorithm_class, key, mode){
       algorithm_class = Algorithm_class(key, mode);

    }

};

Ответы [ 2 ]

3 голосов
/ 05 июня 2011

Вы можете использовать абстрактные классы:

class CryptoAlgorithm
{
   public:
      // whatever functions all the algorithms do
      virtual vector<char> Encrypt(vector<char>)=0;
      virtual vector<char> Decrypt(vector<char>)=0;
      virtual void SetKey(vector<char>)=0;
      // etc
}

// user algorithm
class DES : public CryptoAlgorithm
{
    // implements the Encrypt, Decrypt, SetKey etc
}
// your function
class mode{
public:
    mode(CryptoAlgorithm *algo) // << gets a pointer to an instance of a algo-specific class
           //derived from the abstract interface
         : _algo(algo) {}; // <<- make a "Set" method  to be able to check for null or
                       // throw exceptions, etc
private:
    CryptoAlgorithm *_algo;
}

// in your code
...
_algo->Encrypt(data);
...
//

Таким образом, когда вы вызываете _algo->Encrypt - вы не знаете и не заботитесь о том, какой конкретный алгоритм вы используете, просто о том, что онреализует интерфейс, который должны реализовывать все криптоалгоритмы.

2 голосов
/ 05 июня 2011

Ну, а как же

template<class AlgorithmType>
class mode{
  private:
    AlgorithmType _algo;

  public:
    mode(const AlgorithmType& algo)
      : _algo(algo) {}
};

Нет необходимости в параметрах mode и key, так как алгоритм может быть создан пользователем:

mode<YourAlgorithm> m(YourAlgorithm(some_key,some_mode));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...