3

我有Message一个std::string作为数据成员的类,定义如下:

class Message
{
// Member Variables
    private:
        std::string text;
        (...)

// Member Functions
    public:
        Message(const std::string& t)
        : text(t) {}

        std::string getText() const {return text;}
        (...)
};

这个类用在另一个类的向量中,像这样:

class Console
{
// Member Variables
    private:
        std::vector<Message> messageLog;
        (...)

// Member Functions
    public:
        Console()
        {
            messageLog.push_back(Message("Hello World!"));
        }

        void draw() const;
};

draw()中,有一个迭代器调用getText(). 当它发生时,程序会出现段错误。我已经确定这在构造函数中text是有效的。Message但是,我无法从内部判断它是否有效Console。我假设是这样,但是如果我尝试检查Console'messageLog 的索引,gdb 会告诉我:

(gdb) p messageLog[0]
One of the arguments you tried to pass to operator[] could not be converted to what the function wants.

有谁知道发生了什么?

编辑:这里是draw(). TCODConsole是我正在使用的 curses 库的一部分,因此此函数将每条消息打印Console到 curses 屏幕的一部分。 TL并且BRPoint成员对象(两个整数),它们告诉屏幕上要绘制的位置Console。我遗漏了原始问题的部分内容MessageConsole希望能让事情更清楚,但如果你需要我发布整个课程,那么我可以。它们不会太长。

void Console::draw() const
        {
            int x = TL.getX(), y = TL.getY();
            int width = BR.getX() - TL.getX();
            int height = BR.getY() - TL.getY();

            // draw the Console frame
            TCODConsole::root->printFrame(x, y, width, height, true);

            // print the Console's messages
            vector<Message>::const_iterator it;
            for(it=messageLog.begin(); it<messageLog.begin()+height-1; ++it)
            {
                string message = "%c" + it->getText();
                TCODConsole::setColorControl(TCOD_COLCTRL_1, 
                                             it->getForeColor(),
                                             it->getBackColor());
                y += TCODConsole::root->printRectEx(x, y, width, height,
                                                    TCOD_BKGND_NONE,
                                                    TCOD_LEFT,
                                                    message.c_str(),
                                                    TCOD_COLCTRL_1);
            }
        }
4

4 回答 4

2

我的猜测是,在您使用it->getText()时,迭代器为 NULL。在遍历it != messageLog.end()数组时以及调用it->getText().

于 2010-06-21T22:19:17.973 回答
0

是肯定的std::vector messageLog还是不是的std::vector<Message> messageLog?这似乎有点奇怪。

于 2010-06-21T21:42:25.293 回答
0

高度与向量的索引有什么关系?你有:

messageLog.begin()+height-1;

为什么要将屏幕坐标添加到迭代器?这似乎是您的问题,而且您很可能索引过度,这就是您获得 SIGSEGV 的原因。

您可能想要的是简单地遍历向量中的所有消息并将它们显示在屏幕上的特定位置。我知道您要做什么,但是如果您尝试使用迭代器计算屏幕边界,那么您肯定会以错误的方式进行。尝试运行计数器或获取messageLog.size(),然后在每次迭代时重新计算高度。至于循环只是做:

for(it=messageLog.begin(); it!=messageLog.end(); ++it)
于 2010-06-21T22:22:29.403 回答
-2

Message可能是因为方法中创建的对象的作用域Console就是Console方法。因此,如果您的程序试图以另一种方法访问此对象,例如draw,您将收到此分段错误,因为此对象在执行后被删除。

试试这个(只需插入一个new关键字):

    Console()
    {
        messageLog.push_back(new Message("Hello World!"));
    }

在这种情况下,控制台结束后对象不会被删除。

只要记住删除程序不再需要时创建的对象即可。

于 2010-06-21T21:56:38.633 回答