Наследование класса C ++ от шаблонного класса - PullRequest
0 голосов
/ 09 мая 2018

Здравствуйте, я новичок в 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 с использованием шаблона.

1 Ответ

0 голосов
/ 09 мая 2018

вам нужно наследовать от конкретного экземпляра ShiftCipher. Помните, что OperationRoom не является шаблоном, поэтому он должен наследовать только конкретный экземпляр.

вместо

class OperationsRoom :public SubstitutionCipher, public ShiftCipher<int key>

вы даете фактический ключ .. например, если ключ 67

class OperationsRoom :public SubstitutionCipher, public ShiftCipher<67>

или вам нужно создать шаблон для OperationRooms, если вы хотите обобщить OperationRooms для любого ключа: что-то вроде

template<int key>
class OperationsRoom :public SubstitutionCipher, public ShiftCipher<key>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...