类型'std :: vector <message> **'中的const_cast无效,输入'std :: vector <message *> *'</message *> </message>

时间:2012-05-27 10:09:49

标签: c++

我在函数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));
}

这给了我前面提到的错误。也许,我应该改变我的变量 有任何想法吗?谢谢。

2 个答案:

答案 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的副本并不是不合理且更安全。