Как проверить данную реализацию ADT с помощью таких шаблонов, кака также? - PullRequest
0 голосов
/ 06 февраля 2019

Я работаю над проблемой, которая требует реализации двух ADT.После Внедрения мне нужно протестировать мои реализации сумок со следующими комбинациями шаблонов:

<int, string> - все функции <string, int> - вставить и найти только функции

Мое тестирование до сих порвводил целые числа для проверки различных функций.Я не понимаю, что значит тестировать реализации с помощью шаблонов.

Вот моя реализация bagADT:

#include <stdlib.h>
#include "bagADT.h"

template <typename E>
class ABag : public Bag<E> {
private:
int maxSize;
int listSize;
E* listArray;
public:
ABag(int size = defaultSize) { // Constructor
    maxSize = size;
    listSize = 0;
    listArray = new E[maxSize];
}
~ABag() { delete[] listArray; } // Destructor

bool addItem(const E& item) {
    if (listSize >= maxSize) {
        return false;
    }
    listArray[listSize] = item;
    std::cout << "Add Item: Added " << item << " in spot " << listSize << std::endl;
    listSize++;
    return true;
}

bool remove(E& item) {
    for (int i = 0; i < listSize; i++) {
        if (listArray[i] == item) {
            std::cout << "Remove: Removed " << item << " from position ";
            item = i;
            std::cout<< item << " and adjusted the location of all other elements." << std::endl;
            for (i= item; i < listSize; i++) {
                listArray[i] = listArray[i + 1];
            }
            listSize--;
            return true;
        }
    }
    return false;
}

bool removeTop(E& returnValue) {
    if (listSize == 0) {
        return false;
    }
    else {
        returnValue = listArray[listSize - 1];
        std::cout << "Remove Top: Removed " << returnValue << " from the top of the stack." << std::endl;
        for (int i = listSize; i < maxSize; i++) {
            listArray[i] = listArray[i + 1];
        }
        listSize--;
        return true;
    }
}

bool find(E& returnValue) const {
    for (int i = 0; i < (listSize - 1); i++) {
        if (listArray[i] == returnValue) {
            returnValue = i;
            return true;
        }
    }
    return false;
}

bool inspectTop(E& item) const {
    if (listSize == 0) {
        return false;
    }
    else {
        item = listArray[listSize - 1];
        std::cout << "Inspect Top: The value on top is currently " << item << "." << std::endl;
        return true;
    }
}

void emptyBag() {
    delete[] listArray;
    listSize = 0;
    listArray = new E[maxSize];
    std::cout << "Empty Bag: Emptied the bag." << std::endl;
}

bool operator+=(const E& addend) {
    if (listSize < maxSize) {

        return true;
    }
    return false;
}

int size() const {
    std::cout << "Size: Number of elements in listArray: " << listSize << std::endl;
    return (listSize - 1);
}
int bagCapacity() const {
    std::cout << "Bag Capacity: The capacity of this bag is " << maxSize << std::endl;
    return maxSize;
}
};  

Вот еще один файл, предоставленный моим профессором, под названием kvpairs:

#ifndef KVPAIR_H
#define KVPAIR_H

// Container for a key-value pair
// Key object must be an object for which the == operator is defined.
// For example, int and string will work since they both have == defined,
// but Int will not work since it does not have == defined.
template <typename Key, typename E>
class KVpair {
private:
Key k;
E e;
public:
// Constructors
KVpair() {}
KVpair(Key kval, E eval)
{
    k = kval; e = eval;
}
KVpair(const KVpair& o)  // Copy constructor
{
    k = o.k; e = o.e;
}

void operator =(const KVpair& o) // Assignment operator
{
    k = o.k; e = o.e;
}

bool operator==(const KVpair& o) const {
    if (o.k == k) {
        return true;
    }
    return false;
}

//The following overload is provided by Adam Morrone, Spring 2016 class.
//Thanks Adam :)
friend ostream& operator<<(ostream& os, const KVpair& o) // output print operator 
{
    os << "Key:  " << o.k << "    Value:  " << o.e;
    return os;
}



// Data member access functions
Key key() { return k; }
void setKey(Key ink) { k = ink; }
E value() { return e; }
};


#endif

Ожидается, что я покажу результаты теста с использованием вышеуказанных шаблонов, но я не знаю, как это сделать.Кроме того, игнорируйте перегрузку + =.Это неверно и я знаю.Я должен перегрузить его, чтобы напрямую добавить новый массив в массив.

1 Ответ

0 голосов
/ 06 февраля 2019

Кажется, теперь я понимаю.Я могу ошибаться, но это мое предположение.

Ваша сумка однотипная, но в ней будет KVpair.Они сказали, что будут использовать KVpair с <int, string> и <string, int>.

Когда они говорят о тестировании, это означает, что они будут создавать его следующим образом:

int main() {
    ABag<KVPair<int, string>> bag;
    bag.addItem(KVpair(1, "hi"));
    //...
}

Этоэто то, что я почти уверен, что они имеют в виду под «тестированием с помощью шаблонов».

Как незначительное редактирование, я не знаю, какую версию C ++ вы используете, но если она очень архаичная, вам может понадобиться написать шаблоннапример, ABag<KVPair<int, string> > вместо того, чтобы соединять их вместе.Я смутно помню, что это было проблемой давным-давно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...