В чем проблема с этой частью реализации очереди C ++? - PullRequest
2 голосов
/ 28 августа 2010

Я пытаюсь написать связанную очередь в C ++, но пока не удается.Я уже создал 2 файла: мой main.cpp и box.h.При попытке использовать мой ящик я получаю следующее сообщение:

Описание Путь к ресурсу Расположение Тип преобразования из «Box *» в нескалярный тип «Box» запрошенный main.cpp / QueueApplication line 14 C/ C ++ Проблема

Мой код выглядит следующим образом:

box.h

#ifndef BOX_H_
#define BOX_H_

template<class T>
class Box
{
public:
    Box(T value)
    {
        this->value = value;
        this->nextBox = NULL;
    }
    T getValue()
    {
        return this->value;
    }
    void setNext(Box<T> next)
    {
        this->nextBox = next;
    }
private:
    T value;
    Box<T> nextBox;
};

#endif /* BOX_H_ */

main.cpp

#include<iostream>
#include "box.h"

using namespace std;
int main(int argc, char** argv)
{
    Box<int> newBox = new Box<int>();
    cout << "lol";
    cin.get();
    cin.ignore();
    return 0;
}

Не могли бы вы, ребята, помочь мне?

PS: прежде чем кто-то спросит меня, почему бы не использовать stl ... Я в классе структур данных.

Ответы [ 6 ]

5 голосов
/ 28 августа 2010

Удаляя неважные вещи, мы видим, что вы объявили новый класс, подобный этому:

template<class T>
class Box
{
    T value;
    Box<T> nextBox;
};

Насколько большой Box<T>?

Очевидно

sizeof Box<T> >= sizeof(Box<T>::value) + sizeof(Box<T>::nextBox)
sizeof Box<T> >= sizeof(T) + sizeof(Box<T>)
0 >= sizeof (T)

э-о

4 голосов
/ 28 августа 2010

Проблема с этой строкой

Box<int> newBox = new Box<int>();

Оператор new возвращает указатель на объект Box, созданный в куче.Указатель будет иметь тип Box<int>*.Левая часть этого выражения объявляет объект Box.Вы не можете напрямую назначить указатель на X для X. Вам, вероятно, следует просто пропустить ключевое слово new, если у вас нет причин хотеть управлять временем хранения объекта вручную.Кстати, держу пари, что вы пришли из Java, где new всегда требуется для создания объектов.Не так в C ++.

Также я думаю, что это здорово, что ваш класс структур данных знакомит вас с шаблонами сразу.

4 голосов
/ 28 августа 2010

Я считаю, что ваш nextBox должен быть указателем.

Box<T> * nextBox;

Метод setNext должен работать и с указателями.

void setNext(Box<T> * next)

И newBox должен быть указателем.

Box<int> * newBox = new Box<int>(); 

Поскольку вы пришли из Java-фона, вы предполагаете, что все ваши объекты являются ссылками.Синтаксис немного отличается в C ++.

2 голосов
/ 28 августа 2010

Здесь несколько проблем.

Прежде всего, чтобы реализовать связанный список (или очередь, которая использует связанный список) в C ++, вам нужно использовать указатели. В Java все является ссылкой. C ++, с другой стороны, проводит четкое различие между объектами и указателями на объекты. (Есть также ссылки на объекты, но они здесь неактуальны).

Давайте также на время забудем шаблоны, потому что они не являются частью проблемы.


class Box
{
  int value;
  Box nextBox;  // wrong! should be a pointer
};

неверно, потому что nextBox должен быть указателем на следующий элемент списка / очереди. Правильный путь будет Box *nextBox;

К тому же токену setNext() следует также взять указатель на Box в качестве аргумента. setNext(Box b) является примером передачи по значению, т.е. е. эта функция-член (метод в языке Java) получает свою собственную копию всего объекта Box. Это может привести к проблемам с производительностью, если объект большой, не говоря уже о том, что любые изменения, внесенные в него функцией, будут невидимы для вызывающей стороны. Вместо этого здесь требуется передача по ссылке, которая выполняется с помощью указателя.

И, наконец, new в C ++ всегда возвращает указатель. Вы должны иметь Box<int> *newBox = new Box<int>;

1 голос
/ 28 августа 2010

Когда вы используете new, вы получаете указатель на объект, а не на простой объект.Объявите вашу переменную как указатель или просто разместите объект в стеке.

Я надеюсь, что это имеет смысл для вас, поскольку, если это не так, вам, вероятно, следует вернуться и прочитать больше об основах ООПв C ++.

0 голосов
/ 28 августа 2010

Ребята. Нет сырых указателей в C ++, если они вам действительно не нужны. Пожалуйста. Особенно для бедной души, которая даже не знает, что оператор new возвращает указатель. Получите std :: auto_ptr или std :: shared_ptr.

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