Создать новый обратный список (собственный класс), используя вектор в C ++ - PullRequest
0 голосов
/ 29 октября 2018

У меня есть следующий код:

#include <vector>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <tchar.h>

class TList {
private:
     std::vector<const char*> elementos;
     int position;
     TList(std::vector<const char*> elementos);
public:
    TList(const char** e, int s);
    TList *GetReverseList();
    int Size();
    const char *Next();
};

TList::TList(const char** e, int s) {
    std::vector<const char*> res (&e[0], &e[s]);
    elementos = res;
    position = 0;
}

TList::TList(std::vector<const char *> elements) {
    std::vector<const char*> res = std::vector<const char*>();
    int size = elements.size();
    for (int i = 0; i < size; i++) {
        res.push_back(elements.at(i));
    }
    elementos = res;
    position = 0;
}

//Create a new TList with the reverse list of elements
TList *TList::GetReverseList() {
    TList *res = new TList(elementos);
    std::reverse(res->elementos.begin(), res->elementos.end());
    return res;
}

int TList::Size() {
    return elementos.size();
}

//Use the position to get the next char *
const char * TList::Next() {
    const char * res;
    if (elementos.empty()) {
        res = NULL;
    }
    else {
        int pos = position;
        int size = elementos.size();
        res = pos == size ? elementos.at(position - 1) : elementos.at(position);
        if (pos < size) {
            position++;
        }
    }
    return res;
}

int main()
{
    int size = 2;
    const char *arr[2] = {"Hola", "AAAA"};
    TList *list = new TList(arr, size);
    TList *listReverse = list->GetReverseList();
    printf("Size: %u \n", listReverse->Size());
    printf("First value: %s \n", listReverse->Next());
    printf("Second value: %s \n", listReverse->Next());
    delete list;
    delete listReverse;
    return 0;
}

Когда я запускаю его в Visual Studio, он говорит в консоли

Size: 2
First Value: AAAA
Second Value: Hola

и выдает исключение «ucrtbased.pdb notloaded». «Ucrtbased.pdb содержит отладочную информацию, необходимую для поиска источника для модуля ucrtbased.dll», вот изображение: enter image description here

, а также открыть это окно:

enter image description here

все эти исключения вызываются при попытке удалить listReverse, вот еще один захват стека вызовов (игнорируйте дополнительные переменные, такие как listCopy): enter image description here

Я хочу создать новый TList как можно более оптимизированным, но с его обращенными элементами я не хочу создавать конструктор копирования, потому что он мне нужен как функция "GetReverseList", так что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Я понял, что ошибка отличается, так как, как я уже говорил ранее, основная проблема заключается в том, что listReverse кода является listReverseOptimizada, другой listReverse в синтаксическом анализе - "TList", а не "TList *". поэтому, когда я пытаюсь удалить его, я ставлю «delete & listReverse», и он выдает ошибку, как я могу удалить объект «TList»?

Вот полный код, включающий этот элемент:

#include <vector>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <tchar.h>

class TList {
private:
     std::vector<const char*> elementos;
     int position;
     TList(std::vector<const char*> elementos);
public:
    TList(const char** e, int s);
    TList(const TList & list);
    TList GetReverseList(TList lstSrc);
    TList *GetReverseList();
    int Size();
    const char *Next();
};

TList::TList(const char** e, int s) {
    std::vector<const char*> res (&e[0], &e[s]);
    elementos = res;
    position = 0;
}

TList::TList(std::vector<const char *> elements) {
    std::vector<const char*> res = std::vector<const char*>();
    int size = elements.size();
    for (int i = 0; i < size; i++) {
        res.push_back(elements.at(i));
    }
    elementos = res;
    position = 0;
}

TList::TList(const TList & list) {
    std::vector<const char*> el = std::vector<const char*>();
    int size = list.elementos.size();
    for (int i = 0; i < size; i++) {
        el.push_back(list.elementos[i]);
    }
    elementos = el;
    position = 0;
}

//Create a new TList * with the reverse list of elements
TList *TList::GetReverseList() {
    TList *res = new TList(elementos);
    std::reverse(res->elementos.begin(), res->elementos.end());
    return res;
}

//Create a new TList with the reverse list of elements
TList TList::GetReverseList(TList lstSrc) {
    TList *res = new TList(lstSrc);
    std::reverse(res->elementos.begin(), res->elementos.end());
    return *res;
}

int TList::Size() {
    return elementos.size();
}

//Use the position to get the next char *
const char * TList::Next() {
    const char * res;
    if (elementos.empty()) {
        res = NULL;
    }
    else {
        int pos = position;
        int size = elementos.size();
        res = pos == size ? elementos.at(position - 1) : elementos.at(position);
        if (pos < size) {
            position++;
        }
    }
    return res;
}

int main()
{
    int size = 2;
    const char *arr[2] = {"Hola", "AAAA"};
    TList *list = new TList(arr, size);
    TList listReverse = list->GetReverseList(*list);
    TList *listReverseOptimized = list->GetReverseList();
    delete list;
    delete listReverse;
    delete listReverseOptimized;
    return 0;
}

Я пытался поставить «delete listReverse» вместо «delete & listReverse», но это не работает, вот изображение: enter image description here

0 голосов
/ 29 октября 2018

Не следует использовать elements в качестве аргумента в TList::TList(std::vector<const char *> elements), поскольку elements был определен как член класса.

Может работать следующее code:

#include <vector>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <iostream>
//#include <tchar.h>

class TList {
private:
     std::vector<const char*> elementos;
     int position;
     TList(std::vector<const char*> elementos);
public:
    TList(const char** e, int s);
    TList *GetReverseList();
    int Size();
    const char *Next();
};

TList::TList(const char** e, int s) {
    std::vector<const char*> res (&e[0], &e[s]);
    elementos = res;
    position = 0;
}

TList::TList(std::vector<const char *> ve) {
    std::vector<const char*> res = std::vector<const char*>();
    int size = ve.size();
    for (int i = 0; i < size; i++) {
        res.push_back(ve.at(i));
    }
    elementos = res;
    position = 0;
}

//Create a new TList with the reverse list of elements
TList *TList::GetReverseList() {
    TList *res = new TList(elementos);
    std::reverse(res->elementos.begin(), res->elementos.end());
    return res;
}

int TList::Size() {
    return elementos.size();
}

//Use the position to get the next char *
const char * TList::Next() {
    const char * res;
    if (elementos.empty()) {
        res = NULL;
    }
    else {
        int pos = position;
        int size = elementos.size();
        res = pos == size ? elementos.at(position - 1) : elementos.at(position);
        if (pos < size) {
            position++;
        }
    }
    return res;
}

int main()
{
    int size = 2;
    const char *arr[2] = {"Hola", "AAAA"};
    TList *list = new TList(arr, size);
    TList *listReverse = list->GetReverseList();
    printf("Size: %u \n", listReverse->Size());
    printf("First value: %s \n", listReverse->Next());
    printf("Second value: %s \n", listReverse->Next());
    delete list;
    delete listReverse;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...