我在函数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 *收件箱。它看起来像:
const vector<Message>& MessageBox::getMessages(string messageBox) const
{
if(messageBox == "inbox")
return (const_cast <vector<Message>&>(inbox->messages));
}
这给了我前面提到的错误。也许,我应该改变我的变量 有任何想法吗?谢谢。
答案 0 :(得分:0)
这是你的问题。 inbox->messages
的类型为const std::vector<Messages> *
。如果要返回对inbox->messages
指向的值的引用,只需引用指针:
return *inbox->messages;
根本不需要const_cast
,因为源和目标类型都已cosnt
。
话虽这么说,你的代码不必要地使用了大量的指针。为什么inbox
是指针?为什么不只是一个价值成员?为什么messages
指向std::vector
而不仅仅是一个值?
答案 1 :(得分:0)
你的回程应该是
return *inbox->messages;
请注意,如果messageBox != "inbox"
,您还应该返回一些内容。这有点棘手,因为你不能合法地只返回对临时本地的引用。
你的getMessages
函数可能更好地返回std::vector<Message>*
,因为它是在类中保存的,并且它会使代码的用户更清楚,他们应该在访问时采取通常的预防措施指针(即检查nullptr
)。
更好的方法是完全摆脱原始指针的使用。感谢std::shared_ptr
messages
,因为它在Box
和任何调用getMessages
之间共享,如果unique_ptr
未共享,则支持Box
。
你可能并不真的需要这两个指针,所以根本不使用指针会更简单。除非您希望messages
的大小很大且/或getMessages
被非常频繁地调用,否则返回messages
的副本并不是不合理且更安全。