次のように定義されたデータメンバーとしてを持つクラス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
とBR
はPoint
、画面上のどこに描画するかを示すメンバー オブジェクト (2 つの int) ですConsole
。うまくいけば物事を明確にするために元の質問の一部Message
を省略しましたが、クラス全体を投稿する必要がある場合は、投稿できます。Console
長すぎません。
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);
}
}