0

これにより、ポインターを正しく使用していないと思います。

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;
}

そのため、メイン ファイルでは、cout が呼び出されると、コンパイルされたファイルを実行すると、出力される空の行の一定のループが表示されます。今はシンプルに保ち、clang で makefile を使用するだけです

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
4

1 に答える 1

2

何をしているのかを完全に理解していない限り、生のポインターを使用しないでください。次のコードには問題があります。

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

したがって、ローカル オブジェクトを使用する代わりに、ヒープ上に作成する必要があります。前に言ったように、shared_ptr と weak_ptr を使用することもお勧めします (循環参照があるため、後で必要になります)。

于 2013-09-25T19:43:31.797 に答える