Неверная инициализация неконстантной ссылки типа 'AssortedSorter &' из значения типа BubbleSort * " - PullRequest
0 голосов
/ 29 января 2020

У меня есть программа, которую я пишу, которая имеет абстрактный базовый класс "AssortedSorted", производный класс "BubbleSort" и класс для проверки сортировки "AssortedSorterTest".

Идея заключается в создании экземпляр bubbleSort, передайте этот экземпляр экземпляру assortedSorterTest вместе с int для количества случайных чисел, которые нужно создать и отсортировать, и верните true из метода assortedsorter.testSort (), если вектор отсортирован и содержит то же количество элементов, что и вектор, который ему был дан.

Если вы читаете код, есть вещи, которые необходимо изменить, чтобы выполнить sh, но я пока не имею дела с их исправлением, если они не имеют отношения к проблеме. В настоящее время у меня есть неправильная инициализация в строке 16 в main. cpp. Ошибка, которую я получаю, это

"недопустимая инициализация неконстантной ссылки типа 'AssortedSorter &' из значения типа BubbleSort *"

Изначально я думал, что добавление #include "BubbleSort .h "в классе AssortedSorterTest может исправить проблему, но это не так. Я также попытался изменить некоторые ссылки на указатели, это создало для меня новые проблемы, поэтому я переключился на ссылки. Мне не повезло выяснить это, так что любая помощь будет оценена.

#pragma once
#include <vector>
#include <string>

class AssortedSorter
{
public:

    virtual std::vector<int> sort(const std::vector<int> &itemsToSort) = 0;
    virtual std::string getName() const = 0;
    virtual ~AssortedSorter() {};

};

#include <sstream>

class BubbleSort : public AssortedSorter
{    
private:
    long loopCount{0};
    long swapCount{0};

public:
    BubbleSort();
    ~BubbleSort() override;

    std::vector<int> sort(const std::vector<int> &itemsToSort) override;
    std::string getName() const override;
    friend std::ostream &operator<<(std::ostream &out, const BubbleSort &rhs);


};


#include "BubbleSort.h"

BubbleSort::BubbleSort()
{
}

BubbleSort::~BubbleSort() 
{
}

std::vector<int> BubbleSort::sort(const std::vector<int> &itemsToSort)
{

    std::vector<int> itemsSorted = itemsToSort;
    bool swap{false};
    int temporary_num{};

    do
    {
        swap = false;

        for (int index = 0; index < itemsSorted.size()-1; index++)
        {
            loopCount++;

            if (itemsSorted[index] > itemsSorted[index + 1])
            {
                swapCount++;

                temporary_num = itemsSorted[index];
                itemsSorted[index] = itemsSorted[index + 1];
                itemsSorted[index + 1] = temporary_num;
                swap = true;
            }
        }
    } while (swap);

    return itemsSorted;
}

std::string BubbleSort::getName() const
    {return "BubbleSort";}

//Overloaded insertion operator
std::ostream &operator<<(std::ostream &os, const BubbleSort &rhs)
{
    os << rhs.getName() << ":     " <<  std::to_string(rhs.loopCount) << "          " << std::to_string(rhs.swapCount);
    return os;
}


#pragma once
#include "AssortedSorter.h"
#include <vector>

class AssortedSorterTest
{
public:
    AssortedSorterTest();
    ~AssortedSorterTest();
    bool testSort(AssortedSorter &assortedSorter, int size);

};


#include "AssortedSorterTest.h"

AssortedSorterTest::AssortedSorterTest()
{
}

AssortedSorterTest::~AssortedSorterTest()
{
}

bool testSort(AssortedSorter &assortedSorter, int size)
{
    std::vector<int> randomNumbers;

    for(int index{0}; index < size; index++)
    {
        randomNumbers.push_back(rand());
    }

    std::vector<int> sortedVector = assortedSorter.sort(randomNumbers);

    if(sortedVector == randomNumbers)
    {
        return true;
    }

    else
    {
        return false;
    }
}
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
#include "AssortedSorterTest.h"
#include "BubbleSort.h"


std::vector<int> assign_vector_values(int size);

int main()
{

    std::vector<int> vec = assign_vector_values(100);

    AssortedSorter &bubbleSort = new BubbleSort; //problem is here

    AssortedSorterTest sortTester;

    if(sortTester.testSort(bubbleSort, 100))
    {
        std::cout << "Vector has been sorted" << std::endl;
    }

    else
    {
        std::cout << "Vector has not been sorted properly" << std::endl;
    }

    delete bubbleSort;

    return 0;
}


std::vector<int> assign_vector_values(int size)
{
    std::vector<int> temp_vector;

    for(int index{0}; index < size; index++)
    {

        temp_vector.push_back(rand());
    }

    return temp_vector;
}

1 Ответ

0 голосов
/ 29 января 2020

В сообщении об ошибке сообщается, в чем конкретно заключается проблема.

new BubbleSort приводит к указателю на BubbleSort.

Вы пытаетесь привязать к нему ссылку с базовым классом BubbleSort. Это не может работать.

Либо вам нужно разыменовать указатель, либо вам нужно инициализировать указатель , а не ссылку, с ним.

В любом случае вам не следует используйте голый new / delete в современном C ++. Вместо этого используйте std::unique_ptr<AssortedSorter> и std::make_unique<BubbleSort>():

std::unique_ptr<AssortedSorter> bubbleSort = std::make_unique<BubbleSort>();

Для этого требуется #include<memory>.


Или, учитывая, как именно код в main выглядит прямо сейчас, есть вообще не нужно динамическое распределение c. Просто

BubbleSort bubbleSort;

тоже подойдет.

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