std::vector 和/或多态性的问题
Problem with std::vector and/or polymorphism
我到处寻找答案,但找不到答案。下面是我在Visual Studio 2017中的简短程序。它不会打印我添加的"房间"——它发布随机值。代码编译完美。只是输出是错误的。我认为大多数代码都是无关紧要的,老实说,我不知道我做错了什么。我认为它可能在矢量/继承部分。
编辑:快速解决。我插入了一个局部变量指向我的向量的指针。谢谢。
房间 :
#pragma once
#include <vector>
class Room {
protected:
int i;
int j;
int size;
char** objs;
public:
Room(int _i = 0, int _j = 0, int _size = 0);
int get_i() const { return i; }
int get_j() const { return j; }
int get_size() const { return size; }
char** get_objs() const { return objs; }
virtual void make_room() = 0;
};
class Maze : public Room {
public:
Maze(int _i, int _j, int _size);
void make_room();
};
class Board {
std::vector<Room*> rooms;
public:
Board() {}
void add_room(int i, int j, int v);
void print_a_room() const;
};
房间.cpp:
#include "room.h"
#include <iostream>
Room::Room(int _i, int _j, int _size) : i(_i), j(_j), size(_size) {
objs = new char*[_size];
for (int i = 0; i < _size; i++) {
objs[i] = new char[_size];
for (int j = 0; j < _size; j++) {
objs[i][j] = ' ';
}
}
}
Maze::Maze(int _i, int _j, int _size) : Room(_i, _j, _size) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
objs[i][j] = '*';
}
}
make_room();
}
void Maze::make_room() {
int x = 1;
}
void Board::add_room(int i, int j, int v) {
rooms.push_back(&Maze(i, j, v));
}
void Board::print_a_room() const {
Room* r = rooms.back();
std::cout << r->get_i() << "," << r->get_j() << std::endl;
}
主.cpp:
#include "room.h"
#include <iostream>
int main() {
Board b;
b.add_room(1, 2, 10);
std::cout << "hello" << std::endl;
b.add_room(3, 4, 5);
b.print_a_room();
return 0;
}
帮助将不胜感激。
这首先不应该编译(这就是原因),但由于您的编译器显然允许它......
您正在存储临时对象的地址:
void Board::add_room(int i, int j, int v) {
rooms.push_back(&Maze(i, j, v)); // <---- There
}
在此表达式中创建的Maze
对象在表达式结束后立即死亡,并且您留下悬空的指针,没有特别指向任何地方。
通常不需要在向量中存储指针,除非你想要多态行为。在这种情况下,请使用合适的智能指针,例如 shared_ptr
或 unique_ptr
.
问题是这样的:rooms.push_back(&Maze(i, j, v))
问题是当前对象是在堆栈上分配的,在此行之后,该对象将被销毁。
从Room*
更改为Room
不是解决方案-如果这样做,则不能具有多态性。
最佳解决方案: rooms.push_back(new Maze(i, j, v))
.
注意:您需要定义三法则,因为存在共享内存。当你做一个pop_back
时,首先调用delete
房间的当前元素的运算符,然后调用pop_back
std::vector
的方法。
相关文章:
- C++boost序列化多态性问题
- 为什么我在虚幻引擎中的多态性和接口方面遇到问题?
- 使用多态性解决代码重复问题
- 与智能指针和矢量C 的多态性有关的问题
- std::vector 和/或多态性的问题
- 多种继承和多态性问题
- C 成员功能多态性问题
- C 的多态性问题 - 数据覆盖
- 静态多态性问题
- 我正在尝试[C++]练习多态性和OOD原则。需要指导和几个问题的答案
- C++对象多态性问题
- 涉及指针成员变量和多态性的非常奇怪的问题
- 多态性和受保护的继承问题
- 多态性确定问题
- 当独生子女类具有虚拟方法时使用多态性的问题
- 解决这个多态性问题的最优雅的方法
- 带有列表的c++多态性问题
- 实例化子类的多态性问题
- 基类和派生类构造函数多态性问题
- C++中的多态性问题