Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::vector和/或多态性问题_C++_Visual Studio 2017 - Fatal编程技术网

C++ std::vector和/或多态性问题

C++ std::vector和/或多态性问题,c++,visual-studio-2017,C++,Visual Studio 2017,我到处找答案,但找不到。以下是我在visual studio 2017中的简短节目。 它既不打印我添加的“房间”,也不打印随机值。 代码编译得很好。只是输出错误。 我想大部分代码都是无关的,我只是不知道我做错了什么。我认为它可能在向量/继承部分 编辑:快速解决。我插入了一个局部变量指向向量的指针。谢谢。 h室: #pragma once #include <vector> class Room { protected: int i; int j; int s

我到处找答案,但找不到。以下是我在visual studio 2017中的简短节目。 它既不打印我添加的“房间”,也不打印随机值。 代码编译得很好。只是输出错误。 我想大部分代码都是无关的,我只是不知道我做错了什么。我认为它可能在向量/继承部分

编辑:快速解决。我插入了一个局部变量指向向量的指针。谢谢。

h室:

#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;
};
#pragma一次
#包括
教室{
受保护的:
int i;
int j;
整数大小;
char**objs;
公众:
房间(单位面积i=0,单位面积j=0,单位面积=0);
int get_i()常量{return i;}
int get_j()常量{return j;}
int get_size()常量{return size;}
char**get_objs()常量{return objs;}
虚拟空间make_room()=0;
};
班级:公共房间{
公众:
迷宫(int_i,int_j,int_size);
腾出空间;
};
班级委员会{
病媒室;
公众:
董事会({}
无效附加房间(内部i、内部j、内部v);
无效打印室()常数;
};
Room.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;
}
#包括“room.h”
#包括
房间:房间(int_i,int_j,int_size):i(_i),j(_j),size(_size){
objs=新字符*[\u大小];
对于(int i=0;i<\u size;i++){
objs[i]=新字符[_size];
对于(int j=0;j<\u size;j++){
objs[i][j]='';
}
}
}
迷宫:迷宫(inti,intj,intsize):房间(inti,intj,intsize){
对于(int i=0;istd::cout get_i()首先不应该编译它(),但是由于编译器显然允许它

您正在存储临时对象的地址:

void Board::add_room(int i, int j, int v) {
    rooms.push_back(&Maze(i, j, v));   // <---- There
}
void Board::添加房间(inti、intj、intv){

房间。推回(&Maze(i,j,v));//问题是:
房间。推回(&Maze(i,j,v))

问题是当前对象是在堆栈上分配的,在这一行之后,该对象将被销毁

Room*
更改为
Room
不是一个解决方案-如果您这样做,您就不会有多态性

最佳解决方案:
房间。推回(新迷宫(i、j、v))

注: 您需要定义三个规则,因为存在共享内存。
当您执行
pop\u back
操作时,首先调用操作人员
delete
对房间的当前元素执行操作,然后调用
pop\u back
方法
std::vector

rooms.push\u back(&Maze(i,j,v))看起来可疑。你是对的。它是一个局部变量。我甚至没有想到…愚蠢的错误。谢谢。@ Itai,而不是编辑这个问题并说你已经解决了这个问题,接受下面的一个答案,这给了你解决的办法。我建议你提高编译器的警告水平。我会寻找提高警告的指南。是的。谢谢。可以存储指向房间的指针。只需传递一个指向动态分配对象的指针(通过new)。如果向量将按值存储房间,则将发生。@Zak Right,尚未考虑其类结构。将编辑。谢谢!出于某种原因,我忘记了整个局部变量范围的事情。从现在开始,我将尝试记住。@rustyx,因为它取的是右值的地址。谢谢!我确实需要记住在弹出前删除它它。我会把它改成新的。是的,我读了很多。智能指针会使它成为我不需要手动删除的东西,对吗?(除非我分配了一个2d数组)
void Board::add_room(int i, int j, int v) {
    rooms.push_back(&Maze(i, j, v));   // <---- There
}