C++ 从类型‘;转换的常量无效;标准::向量<;信息>**’;键入‘;标准::向量<;信息*>*’;
我在函数返回语句中得到一个错误。如果函数声明为:C++ 从类型‘;转换的常量无效;标准::向量<;信息>**’;键入‘;标准::向量<;信息*>*’;,c++,C++,我在函数返回语句中得到一个错误。如果函数声明为: const vector<Message*>& getMessages(string messageBox) const; constvector&getMessages(stringmessagebox)const; 我有类Message、Box和MessageBox: class Box { public: vector <Message> *messages; string name; p
const vector<Message*>& getMessages(string messageBox) const;
constvector&getMessages(stringmessagebox)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;
};
类框
{
公众:
矢量*信息;
字符串名;
公众:
Box();
~Box();
};
类消息框
{
公众:
MessageBox();
~MessageBox();
constvector&getMessages(stringmessagebox)const;
私人:
盒子*收件箱;
};
现在我正在尝试实现函数getMessages。我尝试返回向量*的消息
收件箱。它看起来像:
const vector<Message>& MessageBox::getMessages(string messageBox) const
{
if(messageBox == "inbox")
return (const_cast <vector<Message>&>(inbox->messages));
}
常量向量和MessageBox::getMessages(字符串MessageBox)常量
{
如果(messageBox==“收件箱”)
返回(const_cast(收件箱->消息));
}
这给了我前面提到的一个错误。也许,我应该更改变量。有什么想法吗?谢谢。这是你的问题。
inbox->messages
的类型是const std::vector*
。如果要返回对收件箱->邮件所指向的值的引用,只需引用指针:
return *inbox->messages;
根本不需要const\u cast
,因为源和目标类型都已经是cosnt
也就是说,您的代码不必要地使用了大量指针。为什么inbox
是指针?为什么不只是一个价值观成员?为什么messages
是指向std::vector的指针而不仅仅是一个值?您的返回行应该是
return *inbox->messages;
请注意,如果messageBox!=“收件箱”
。这将有点棘手,因为您不能合法地返回对临时本地的引用
您的getMessages
函数最好返回std::vector*
,因为这就是它在类中的保存方式,它可以让代码用户更清楚地知道,在访问指针时应该采取通常的预防措施(即检查nullptr
)
更好的办法是完全摆脱原始指针的使用。支持std::shared_ptr
用于消息
,因为它是在Box
和任何调用getMessages
之间共享的,如果它不是共享的,则支持unique_ptr
用于Box
你可能并不需要这两个都是指针,所以根本不使用指针会更简单。除非您希望消息
的大小很大和/或getMessages
被频繁调用,只返回消息的副本
看起来像是试图返回指针而不是所需的引用,这并不是不合理的,也安全得多。常量向量&
并不意味着必须返回&变量
。这里的&不是addressof,而是byref。类型std::vector**
和std::vector*
是不相关的。const\u cast
不会(也不应该!)在它们之间转换。请发布函数体并解释您试图执行的操作。但是如果使用const进行声明,如何在不使用const_cast的情况下返回它?问题标题中的错误消息与getMessages
的第一个声明一致,但与MessageBox::getMessages
的声明或定义不一致。请仅发布与您正在发布的错误消息相匹配的代码版本,或者仅发布与您发布的代码实际获得的错误消息。您的意思是源代码和目标代码都是非常量的吗?@Fraser:否。成员函数是一个const
指针,因此,通过它访问的成员将自动成为const
。并且目的地类型是一个常量
向量。所以输入和输出都是常量。我正在阅读与const\u cast
本身的目标相关的源和目标。如果他在演员阵容中取消了对收件箱->消息的引用,他的功能将正常工作。但是演员阵容是无关的,因为他在返回之前将非常量*收件箱->消息
投射到非常量向量&
。