- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
问题是,当我将这些类放入 TransparentMaze 类的 map 中时,我的房间类丢失了它们的字符串变量“名称”值。我不明白他们去哪里了。问题是与 map 比较器还是其他问题有关,希望有人能提供帮助。
#include <iostream>
#include <string>
#include <list>
#include <map>
using namespace std;
class Point{
int x;
int y;
public:
Point(int, int);
~Point(){};
int getX() ;
int getY() ;
};
struct cmp_str {
bool operator()(Point p1, Point p2) {
if (p1.getY() < p2.getY() || p1.getY() == p2.getY() && p1.getX() < p2.getX()) {
return true;
}
return false;
}
};
class Room{
Room *north;
Room *south;
Room *east;
Room *west;
public:
int createDirection[4];
std::string name;
Room(std::string);
~Room();
std::string getName();
std::list<std::string> findPathTo(std::string);
void fillMap(map<Point, Room*, cmp_str>*, int*, int*);
Room& createNorth(std::string);
Room& createSouth(std::string);
Room& createEast(std::string);
Room& createWest(std::string);
Room& getNorth();
Room& getSouth();
Room& getEast();
Room& getWest();
Room& get(std::string);
Room& get(std::list<std::string>);
void setNorth(Room*);
void setSouth(Room*);
void setEast(Room*);
void setWest(Room*);
//bool validatePath(std::list<std::string>);
};
class Maze{
Room *entry;
public:
Maze(string);
~Maze();
Room& getEntry();
};
class TransparentMaze{
std::map<Point, Room*, cmp_str> maze;
int width;
int height;
public:
TransparentMaze(Maze);
~TransparentMaze(){};
std::map<Point, Room*, cmp_str>& getMaze();
};
TransparentMaze::TransparentMaze(Maze maze) {
maze.getEntry().fillMap(&this->maze, &this->width, &this->height);
}
std::map<Point, Room*, cmp_str>& TransparentMaze::getMaze() {
return maze;
}
Point::Point(int x, int y) {
this->x = x;
this->y = y;
}
int Point::getX() {
return x;
}
int Point::getY() {
return y;
}
Maze::Maze(std::string name) {
entry = new Room(name);
}
Maze::~Maze() {
delete entry;
}
Room& Maze::getEntry() {
return *entry;
}
Room::Room(std::string name) {
this->name = name;
for (int i = 0; i < sizeof(createDirection) / sizeof(int); i++) {
createDirection[i] = 0;
}
north = NULL;
south = NULL;
east = NULL;
west = NULL;
}
Room::~Room() {
for (int i = 0; i < sizeof(createDirection) / sizeof(int); i++) {
switch(i) {
case 0:
if (createDirection[i] == 1) {
delete north;
}
break;
case 1:
if (createDirection[i] == 1) {
delete south;
}
break;
case 2:
if (createDirection[i] == 1) {
delete east;
}
break;
case 3:
if (createDirection[i] == 1) {
delete west;
}
break;
}
}
}
Room& Room::get(std::string direction) {
switch(direction[0]) {
case 'N': case 'n': return (this->north == NULL ? *this : *this->north);
case 'S': case 's': return (this->south == NULL ? *this : *this->south);
case 'E': case 'e': return (this->east == NULL ? *this : *this->east);
case 'W': case 'w': return (this->west == NULL ? *this : *this->west);
default: break;
}
return *this;
}
Room& Room::get(std::list<std::string> pathList) {
std::list<std::string>::iterator it;
Room *room = this;
for (it = pathList.begin(); it != pathList.end(); it++) {
if (&(*room) == &room->get(*it)) {
return *this;
}
room = &room->get(*it);
}
return *room;
}
void Room::fillMap(map<Point, Room*, cmp_str> *maze, int *width, int *height) {
std::list<std::list<std::string>> listOfLists;
std::list<std::list<std::string>>::iterator it1;
Room *r;
int n, counter;
*width = *height = 0;
listOfLists.push_back(std::list<std::string>());
for (;;) {
counter = 0;
for (it1 = listOfLists.begin(); it1 != listOfLists.end(); it1++) {
r = &this->get(*it1);
//Point p((int)r->getName()[0] - 64, (int)r->getName()[1] - 48);
//cout << r->getName() << " " << &*r << " " << &this->get(*it1) << endl;
maze->insert(std::make_pair(Point((int)r->getName()[0] - 64, (int)r->getName()[1] - 48), &*r));
//cout << r->getName() << endl;
std::string lastRoom;
n = 0;
if (it1->size() > 0) {
lastRoom = *--it1->end();
}
if (&r->getNorth() != NULL && lastRoom.compare("S") != 0) {
n++;
counter++;
if (n == 1) {
it1->push_back("N");
} else {
std::list<std::string> bufferList(it1->begin(), --it1->end());
bufferList.push_back("N");
listOfLists.push_back(bufferList);
}
}
if (&r->getEast() != NULL && lastRoom.compare("W") != 0) {
n++;
counter++;
if (n == 1) {
it1->push_back("E");
} else {
std::list<std::string> bufferList(it1->begin(), --it1->end());
bufferList.push_back("E");
listOfLists.push_back(bufferList);
}
}
if (&r->getWest() != NULL && lastRoom.compare("E") != 0) {
n++;
counter++;
if (n == 1) {
it1->push_back("W");
} else {
std::list<std::string> bufferList(it1->begin(), --it1->end());
bufferList.push_back("W");
listOfLists.push_back(bufferList);
}
}
if (&r->getSouth() != NULL && lastRoom.compare("N") != 0) {
n++;
counter++;
if (n == 1) {
it1->push_back("S");
} else {
std::list<std::string> bufferList(it1->begin(), --it1->end());
bufferList.push_back("S");
listOfLists.push_back(bufferList);
}
}
}
if(counter == 0) {
/*cout << listOfLists.size() << endl;
map<Point, Room*, cmp_str>::iterator it;
for (it = maze->begin(); it != maze->end(); it++) {
cout << "X: "<< it->first.getX() << " Y: " << it->first.getY() << "; " << (*it->second).getName() << endl;
}*/
return;
}
}
}
std::list<std::string> Room::findPathTo(std::string roomName) {
std::list<std::list<std::string>> listOfLists;
std::list<std::list<std::string>>::iterator it1;
Room *r;
int n, counter;
listOfLists.push_back(std::list<std::string>());
for (;;) {
counter = 0;
for (it1 = listOfLists.begin(); it1 != listOfLists.end(); it1++) {
r = &this->get(*it1);
std::string lastRoom;
n = 0;
if (it1->size() > 0) {
lastRoom = *--it1->end();
}
if (r->getName().compare(roomName) == 0) {
return *it1;
}
if (&r->getNorth() != NULL && lastRoom.compare("S") != 0) {
n++;
counter++;
if (n == 1) {
it1->push_back("N");
} else {
std::list<std::string> bufferList(it1->begin(), --it1->end());
bufferList.push_back("N");
listOfLists.push_back(bufferList);
}
}
if (&r->getEast() != NULL && lastRoom.compare("W") != 0) {
n++;
counter++;
if (n == 1) {
it1->push_back("E");
} else {
std::list<std::string> bufferList(it1->begin(), --it1->end());
bufferList.push_back("E");
listOfLists.push_back(bufferList);
}
}
if (&r->getWest() != NULL && lastRoom.compare("E") != 0) {
n++;
counter++;
if (n == 1) {
it1->push_back("W");
} else {
std::list<std::string> bufferList(it1->begin(), --it1->end());
bufferList.push_back("W");
listOfLists.push_back(bufferList);
}
}
if (&r->getSouth() != NULL && lastRoom.compare("N") != 0) {
n++;
counter++;
if (n == 1) {
it1->push_back("S");
} else {
std::list<std::string> bufferList(it1->begin(), --it1->end());
bufferList.push_back("S");
listOfLists.push_back(bufferList);
}
}
}
if(counter == 0) {
return std::list<std::string>();
}
}
}
/*bool Room::validatePath(std::list<std::string> pathList) {
std::list<std::string>::iterator it;
Room *room = this;
for (it = pathList.begin(); it != pathList.end(); it++) {
if (&(*room) == &room->get(*it)) {
return false;
}
room = &room->get(*it);
}
return true;
}*/
std::string Room::getName(){
return name;
}
Room& Room::createNorth(std::string name) {
north = new Room(name);
createDirection[0] = 1;
north->setSouth(this);
return *north;
}
Room& Room::createSouth(std::string name) {
south = new Room(name);
createDirection[1] = 1;
south->setNorth(this);
return *south;
}
Room& Room::createEast(std::string name) {
east = new Room(name);
createDirection[2] = 1;
east->setWest(this);
return *east;
}
Room& Room::createWest(std::string name) {
west = new Room(name);
createDirection[3] = 1;
west->setEast(this);
return *west;
}
Room& Room::getNorth() {
return *north;
}
Room& Room::getSouth() {
return *south;
}
Room& Room::getEast() {
return *east;
}
Room& Room::getWest() {
return *west;
}
void Room::setNorth(Room *room) {
north = room;
}
void Room::setSouth(Room *room) {
south = room;
}
void Room::setEast(Room *room) {
east = room;
}
void Room::setWest(Room *room) {
west = room;
}
int main() {
Maze maze("A5");
maze.getEntry().createSouth("A6").createEast("B6").createSouth("B7").createWest("A7")
.getEast().createEast("C7").createNorth("C6").createEast("D6").createEast("E6")
.getWest().createNorth("D5").createEast("E5").getWest().getSouth().getWest()
.createNorth("C5").createWest("B5").createNorth("B4").createWest("A4").createNorth("A3")
.getSouth().getEast().getSouth().getEast().createNorth("C4").createNorth("C3")
.createWest("B3").getEast().createNorth("C2").createWest("B2").createWest("A2")
.createNorth("A1").getSouth().getEast().getEast().createEast("D2").createSouth("D3")
.createSouth("D4").createEast("E4").createNorth("E3").createNorth("E2").createNorth("E1")
.createWest("D1").createWest("C1").createWest("B1").getEast().getEast().getEast()
.createEast("F1").createEast("G1").createEast("H1").createSouth("H2").createEast("I2")
.createSouth("I3").createEast("J3").createNorth("J2").createNorth("J1").createWest("I1")
.getEast().getSouth().getSouth().getWest().getNorth().getWest().getNorth().getWest()
.getWest().getWest().getSouth().getSouth().createEast("F3").createEast("G3")
.createNorth("G2").createWest("F2").getEast().getSouth().createEast("H3").createSouth("H4")
.createEast("I4").createEast("J4").createSouth("J5").createWest("I5").createWest("H5")
.getEast().createSouth("I6").createEast("J6").createSouth("J7").createWest("I7")
.createWest("H7").createWest("G7").getEast().createNorth("H6").createWest("G6")
.createWest("F6").createNorth("F5").createNorth("F4").createEast("G4").createSouth("G5")
.getNorth().getWest().getSouth().getSouth().createSouth("F7").createWest("E7")
.createWest("D7");
//cout << (int)'A' << endl;
//cout << (int)'1' << endl;
/*std::list<std::string> list(maze.getEntry().findPathTo("E7"));
std::list<std::string>::iterator it;
for (it = list.begin(); it != list.end(); it++) {
cout << *it << endl;
}*/
//cout << sizeof(maze.getEntry()) << endl;
//Here it has still a value..
cout << maze.getEntry().getName().length() << endl;
TransparentMaze tMaze(maze);
//Here not anymore.. why it's gone?
cout << maze.getEntry().getName().length() << endl;
//tMaze.getMaze();
/*map<Point, Room*, cmp_str>::iterator it;
for (it = tMaze.getMaze().begin(); it != tMaze.getMaze().end(); it++) {
cout << "X: "<< it->first.getX() << " Y: " << it->first.getY() << "; " << it->second->name << endl;
}*/
}
最佳答案
这有点复杂,但这是正在发生的事情。简而言之,TransparentMaze
构造函数获得一个按值传递的 Maze
实例,但是 Maze
类无法安全复制(它包含一个指针)。解决此问题的最直接方法是使 Maze
不可复制(更多内容见下文)并使 TransparentMaze 引用 Maze
(Maze&
)而不是拷贝。
class Maze{
Room *entry;
// these two lines make it non-copyable
Maze(const Maze&); // <-- private copy constructor
Maze& operator=(const Maze&); // <-- private assignment operator
public:
Maze(string);
~Maze();
Room& getEntry();
};
class TransparentMaze{
std::map<Point, Room*, cmp_str> maze;
int width;
int height;
public:
TransparentMaze(Maze&); // pass by reference
~TransparentMaze(){};
std::map<Point, Room*, cmp_str>& getMaze();
};
TransparentMaze::TransparentMaze(Maze& maze) {
maze.getEntry().fillMap(&this->maze, &this->width, &this->height);
}
当 TransparentMaze 被构造时,构造函数获得 Maze
的拷贝,它制作了 entry
指针的拷贝。当 TransparentMaze
构造函数完成并且 ~Maze
析构函数删除 entry
指针时,将删除此拷贝。当您稍后尝试使用已删除的 entry
指针时(在原始 maze
实例中,它是从中复制的)您将得到未定义的行为(我的系统崩溃了)。
关于c++ - 当我将该类放入另一个类的映射中时,类字符串变量会丢失其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7840218/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!