agmcleod
agmcleod

Reputation: 13621

Getting constant empty line output when retrieving a string from a pointer

This is making me think I'm not using the pointer correctly.

main.cpp

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

void initializeRooms(std::vector<Room*>& rooms);

int main() {
  std::vector<Room*> rooms;
  initializeRooms(rooms);
  Room* r = rooms[0];
  std::cout << "You are in room " << r->getName() << "\n";
  return 0;
}

void initializeRooms(std::vector<Room*>& rooms) {
  Room roomOne {"roomOne"};
  Room roomTwo {"roomTwo"};
  Exit exit { &roomOne, &roomTwo };
  roomOne.addExit(&exit);
  rooms.push_back(&roomOne);
  rooms.push_back(&roomTwo);
}

exit.cpp

class Room;

struct Exit {
  Room* room_one;
  Room* room_two;
};

room.h

#ifndef ROOM_H
#define ROOM_H

#include <string>
#include <vector>
#include "exit.cpp"

class Room {
private:
  std::string name;
  std::vector<Exit*> exits;

public:
  Room(std::string n): name{n} {

  }

  void addExit(Exit* e);
  std::string& getName();
};

#endif

room.cpp

#include "room.h"

void Room::addExit(Exit* e) {
  exits.push_back(e);
}

std::string& Room::getName() {
  return name;
}

So in the main file, when the cout is called, I just see a constant loop of empty lines being output when i run the compiled file. Just keeping it simple now and using a makefile with clang

all: build

build: main.o exit.o room.o
    clang++ -std=c++11 main.o exit.o room.o -o simplegame

main.o: main.cpp
    clang++ -std=c++11 -c main.cpp

exit.o: exit.cpp
    clang++ -std=c++11 -c exit.cpp

room.o: room.cpp
    clang++ -std=c++11 -c room.cpp

clean:
    rm -rf *o simplegame

Upvotes: 0

Views: 116

Answers (1)

Slava
Slava

Reputation: 44258

Putting aside that you should not use raw pointers unless you fully understand what you are doing, following code have the problem:

void initializeRooms(std::vector<Room*>& rooms) {
  Room roomOne {"roomOne"};    // this is local object
  Room roomTwo {"roomTwo"};    // this is local object as well 
  Exit exit { &roomOne, &roomTwo }; // exit is also local object and now it holds pointers to other 2 local objects
  roomOne.addExit(&exit);  // same stuff as before
  rooms.push_back(&roomOne); // now you are inserting pointer to local object into vector
  rooms.push_back(&roomTwo); // doing that again
} // now all local objects to this function automatically destroyed and you hold pointers to garbage in rooms

So instead of using local objects you need to create them on the heap. As I said before I would also recommend to use shared_ptr and weak_ptr (later is neccessary because you have cyclic reference).

Upvotes: 2

Related Questions