Хранить адрес объекта внутри узла - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь создать объект класса с именем Cell и сохранить его в связанном списке.Я уверен, что мог бы сделать это с массивом, но часть моего назначения состоит в том, что я использую связанный список, и я не думал, что получу столько проблем.В настоящее время это мой узел.Прямо сейчас у меня есть все эти переменные, хранящиеся в узле, но я бы предпочел создать объект (называемый «Ячейка») для их хранения.Информация должна быть указателем на объект типа T. Прямо сейчас это T должно иметь тип Cell.

template<class T>
struct Node {
    T *info; 
    Node<T> *nodeP;
    Node<T> *linkP;

    int nodeNumber = 0;
    bool purchased = false;

    std::string color = " ";
    int index = 0;
    int max_num = 0;
    std::string name = " ";
    int price;
};

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

template<class T>
void Board<T>::setCellValue() {

    //open file
    ifstream inFile;
    string line;
    inFile.open("CellValues.txt");

    //Check for Error
    if (inFile.fail()) {
        cerr << "File does not exist!";
        exit(1);
    }

    int index = 0, max_num = 0, count = 0, price = 0;
    string color, name;

    istringstream inStream;
    while (getline(inFile, line)) {
        inStream.clear();
        inStream.str(line);

        inStream >> color >> index >> max_num >> name >> price;


        //creates node
        Node<T> *newNodeP = new Node<T>;

        //create pointer, assign pointer to pointer in Node
        //Cell<T> *cellPtr = new Cell<T>(count, name, color, index, max_num, price);
        //newNode->info= cellPtr;
        //creating anonymous object and assigning to the node? I think
        newNodeP->info = new Cell<T>(color, index, max_num, name, price);
        //weird way I was just experimenting with
        newNodeP->info->Cell<T>(count, name, color, index, max_num, price);

        //fills node values(this is what I want to handle in the object
        newNodeP->color = color;
        newNodeP->index = index;
        newNodeP->max_num = max_num;
        newNodeP->name = name;
        newNodeP->nodeNumber += count;
        newNodeP->price = price;

        newNodeP->linkP = NULL;

        if (firstP != NULL)
            lastP->linkP = newNodeP;
        else
            firstP = newNodeP;

        lastP = newNodeP;

        count++;
    }   
}

В настоящее время у меня есть два способа вернуть приземленный узел.Один возвращает Node * и вроде работает.Он возвращает указатель на узел, и я могу получить доступ к значениям внутри этого узла, но я не могу понять, как сохранить указатель на этот узел.

//Find Cell
template<class T>
Node<T>* Board<T>::findCell(int id) {

    for (Node<T> *traverseP = firstP; traverseP != NULL; traverseP = traverseP->linkP) {
        if (traverseP->nodeNumber == id) {
            return traverseP;
        }
    }
    return nullptr;
}

//how I call it in main. it returns an address to that node, but I'm getting errors trying to store that address in a pointer.
cout << "You landed on cell " << gameBoard.findCell(player.getCellNum()) << endl << endl;
Node<T> *ptr = gameboard.findCell(player.getCellNum())->info;

Этот второй способ, я думаю, возвращаетссылка на объект в узле, но моя более ранняя проблема не дает мне понять это.

//Return Cell
template <class T>
T Board<T>::returnCell(int id) {
    for (Node<T> *traverseP = firstP; traverseP != NULL; traverseP = traverseP->linkP) {
        if (traverseP->nodeNumber == id) {
            return traverseP->info;
        }
    }
    return nullptr;
}
//How i'm calling it in main. I don't really know what it's returning though because it only prints "You landed on " and then nothing else. 
    cout << "You landed on " << gameBoard.returnCell(player.getCellNum()) << endl;
...