Reputation: 13621
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
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