0

関数 return ステートメントでエラーが発生します。関数宣言が次の場合に何を返すかを理解するのが難しい:

const vector<Message*>& getMessages(string messageBox) const;

クラス Message、Box、MessageBox があります。

class Box
{
public:
    vector <Message> *messages;
    string name;
public:
    Box();
       ~Box();
};

class MessageBox
{
public:
    MessageBox(); 
    ~MessageBox(); 
        const vector<Message>& getMessages(string messageBox) const;
private:
    Box *inbox;
};

今、関数 getMessages を実装しようとしています。Box *inbox のベクトル *メッセージを返そうとしています。次のようになります。

 const vector<Message>& MessageBox::getMessages(string messageBox) const
{
   if(messageBox == "inbox")
     return (const_cast  <vector<Message>&>(inbox->messages));
}

これにより、前述のエラーが発生します。たぶん、変数を変更する必要があります。
何か案は?ありがとうございました。

4

2 に答える 2

0

これがあなたの問題です。の型はinbox->messagesですconst std::vector<Messages> *。が指す値への参照を返したい場合はinbox->messages、単にポインタを参照します。

return *inbox->messages;

const_castソースと宛先の両方のタイプがすでに であるため、まったく必要ありませんcosnt

そうは言っても、コードは非常に多くのポインターを不必要に使用しています。なぜinboxポインタなのですか?バリューメンバーだけではないのはなぜですか?単なる値ではなくmessagesポインタへのポインタであるのはなぜですか?std::vector

于 2012-05-27T11:03:30.420 に答える
0

あなたのリターンラインは

return *inbox->messages;

if の場合も何かを返す必要があることに注意してくださいmessageBox != "inbox"。合法的に一時的なローカルへの参照を返すことはできないため、これはやや注意が必要です。

あなたのgetMessages関数は、それがクラスで保持される方法であるため、返す方が良いかもしれません。std::vector<Message>*また、ポインタにアクセスするときに通常の予防策を講じる必要があることをコードのユーザーに明確にします (つまり、 をチェックしますnullptr)。

さらに良いのは、生のポインターの使用を完全に取り除くことです。との間で共有std::shared_ptrされているため、 を支持し、共有されていない場合は支持します。messagesBoxgetMessagesunique_ptrBox

これらの両方をポインターにする必要はおそらくないので、ポインターをまったく使用しない方が簡単です。messagesのサイズが大きい、および/または非常に頻繁に呼び出されることが予想される場合getMessagesを除き、 のコピーを返すことは不合理ではなく、はるかに安全ですmessages

于 2012-05-27T11:04:47.080 に答える