Здравствуйте, я новичок в c++
, и у меня есть домашняя работа, для которой требуется шаблон class
называется ShiftCipher
, что не имеет значения, что он делает, и его синтаксис полностью верен и хорошо компилируется:
#ifndef _SHIFTCHIPHER_
#define _SHIFTCIPHER_
#pragma once
#include <iostream>
#include <string>
#define NUM_OF_CHARS 26
#define ZERO 0
#define FIRST 'a'
#define LAST 'z'
template<int key> class ShiftCipher{
public:
std::string encrypt(std::string& str)
{
int length = str.length();
char* newstr = new char[length];
for (int i = 0; i < length; i++)
{
if (str[i] >= FIRST && str[i] <= LAST)
{
if ((str[i] + key - FIRST) > NUM_OF_CHARS)
{
newstr = char(str[i] + key - NUM_OF_CHARS);
}
else
if ((str[i] + key - FIRST) < ZERO)
{
newstr = char(str[i] + key + NUM_OF_CHARS);
}
else
newstr[i] = char(str[i] + key);
}
}
return newstr;
}
std::string decrypt(std::string& str)
{
int length = str.length(),key2=-1*key;
char* newstr = new char[length];
for (int i = 0; i < length; i++)
{
if (str[i] >= FIRST && str[i] <= LAST)
{
if ((str[i] + key2 - FIRST) > NUM_OF_CHARS)
{
newstr = char(str[i] + key2 - NUM_OF_CHARS);
}
else
if ((str[i] + key2 - FIRST) < ZERO)
{
newstr = char(str[i] + key2 + NUM_OF_CHARS);
}
else
newstr[i] = char(str[i] + key2);
}
}
return newstr;
}
};
#endif // !_SHIFTCHIPHER_
А потом у меня есть class
SubstitutionChipher
, который также хорошо работает и не имеет никаких специальных вещей, таких как шаблоны или наследование или что-то еще.
и, наконец, класс OperationsRoom
, который должен быть унаследован от двух упомянутых выше классов:
#ifndef OPERATIONSROOM_H_
#define OPERATIONSROOM_H_
#define ZERO 0
#define ONE 1
#define TWO 2
#define THREE 3
#define FOUR 4
#define FIVE 5
#define SIX 6
#define MAX_MSGS_NUMBER 2
#define FIRST_SHIFT_LENGTH 5
#define SECOND_SHIFT_LENGTH 10
#define THIRD_SHIFT_LENGTH 15
#define MALICIOUSE_WORD "SpongeBob"
#include"ShiftCipher.h"
#include"SubstitutionCipher.h"
class OperationsRoom :public SubstitutionCipher, public ShiftCipher<int key>
{
int counter, flag;
public:
OperationsRoom()
{
counter = ZERO;
flag = ZERO;
}
void getMsg(std::string& msg)
{
std::string newmsg;
if (counter > SIX*MAX_MSGS_NUMBER)
{
counter = ZERO;
flag = ZERO;
}
if ((counter >= ZERO && counter < MAX_MSGS_NUMBER) || (counter >= TWO * MAX_MSGS_NUMBER && counter < THREE*MAX_MSGS_NUMBER)
|| (counter >= FOUR * MAX_MSGS_NUMBER && counter < FIVE*MAX_MSGS_NUMBER))
{
newmsg = SubstitutionCipher::decrypt(msg);
}
else
if ((counter >= MAX_MSGS_NUMBER && counter < TWO*MAX_MSGS_NUMBER))
{
ShiftCipher<FIRST_SHIFT_LENGTH> shifting;
newmsg = shifting.decrypt(msg);
}
else
if ((counter >= THREE * MAX_MSGS_NUMBER && counter< FOUR*MAX_MSGS_NUMBER))
{
ShiftCipher<SECOND_SHIFT_LENGTH> shifting;
newmsg = shifting.decrypt(msg);
}
else
if ((counter >= FIVE * MAX_MSGS_NUMBER))
{
ShiftCipher<THIRD_SHIFT_LENGTH> shifting;
newmsg = shifting.decrypt(msg);
}
int found = newmsg.find(MALICIOUSE_WORD);
if (found != -1)
flag = ONE;
std::cout << "A new message has been received.\n";
if (flag && !((counter + ONE) % MAX_MSGS_NUMBER))
{
flag = ZERO;
std::cout << "Maliciouse detected!\n";
}
else
if (!flag && !((counter + ONE) % MAX_MSGS_NUMBER))
{
flag = ZERO;
std::cout << "Maliciouse wasnt detected!\n";
}
}
};
#endif
так что он продолжает давать мне ошибки, такие как:
ошибка C2146: синтаксическая ошибка: отсутствует «>» перед идентификатором «ключ».
ошибка C2993: 'int': недопустимый тип для нетипичного параметра шаблона 'key'
ошибка C2993: 'int': недопустимый тип для нетипичного параметра шаблона 'key'
ошибка C2955: «ShiftCipher»: использование шаблона класса требует списка аргументов шаблона
примечание: см. Объявление ShiftCipher
Я посмотрел на форуме об этих ошибках, но ни одна из них не помогла мне, поэтому я был бы рад за некоторую помощь.
и я думаю, что настоящая проблема заключается в определении класса OperationsRoom
с использованием шаблона.