我不能创建一个自定义的类没有遇到编译错误
所以,我想创建一个自定义类,但无法弄清楚如何让它正常工作。以下是我想出了:我不能创建一个自定义的类没有遇到编译错误
message.h:
#include <errno.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fstream>
#include <string>
using namespace std;
class Message {
public:
Message(string, string, int);
~Message();
string getMessage();
string getSubject();
int getLength();
void setMessage(string);
void setLength(int);
void setSubject(string);
private:
string subject;
string message;
int length;
};
而且message.cc:
#include "message.h"
Message::Message(string Subject, string Message, int Length){
subject = Subject;
message = Message;
length = Length;
}
string
Message::getMessage(){
return message;
}
void
Message::setMessage(string Message){
message = Message;
}
string
Message::getSubject(){
return subject;
}
void
Message::setSubject(string Subject){
subject = Subject;
}
int
Message::getLength(){
return length;
}
void
Message::setLength(int Length){
length = Length;
}
这里就是我想要做:
map<string,vector<Message> > database;
string request = get_request(client);
//store the request in memory
vector<Message> messageList = database.at("user1");
messageList.push_back(new Message("subject", request, request.size()));
database["user1"] = messageList;
此代码给出了以下编译错误(因为我正在创建一条新消息):
//no known conversion for argument 1 from Message* to const Message&
但是,当我改变代码为:
//store the request in memory
vector<Message> messageList = database.at("user1");
Message message;
message.setMessage(request);
message.setSubject("subject");
message.setLength(request.length());
messageList.push_back(message);
database["user1"] = messageList;
它给出消息消息下列错误:
//No matching function for call to Message::Message()
//candidates are:
//Message::Message(str::string, str::string, int)
//Message::Message(const Message&)
//candidate expects 3 and 1 arguments, 0 provided
所以,这使我相信,我失去了一些东西在我的消息类(或头),这将允许这种类型的实例,但我不知道如何做到这一点或我失踪。任何帮助将非常感激。我只对C++有一个非常基本的理解,因为我主要使用Java进行编程,但无论我尝试查找错误还是以其他方式编写代码,我都无法编译代码。再次感谢。
将messageList.push_back(new Message("subject", request, request.size()));
更改为:
messageList.push_back(Message("subject", request, request.size()));
你有一个向量M消息(管理自己的内存),而不是指向你管理的内存的向量。
等效你可以写:
Message message("subject", request, request.size()));
messageList.push_back(message);
您与Message message;
尝试失败,因为你没有一个默认的构造函数。
在C++ 11你也可以这样写:
messageList.emplace_back("subject", request, request.size());
其他的事情:
的第三个参数(
Length
)是多余的,因为消息可能只是做message.size()
时它需要知道这一点。database["user1"] = messageList;
将覆盖已经在地图中的矢量;如果你想添加到地图中,然后摆脱messageList
载体和做database["user1"].push_back("subject", request, request.size());
看来你有各种各样的问题。其中之一是,你需要当你正在被调用默认的构造函数:
Message message;
增加,这将可能就够了:
Message::Message(){
}
和相应的声明中.H
问题不在于构造函数,而在于向量中的类型不匹配。 – 2014-09-22 03:30:08
没有赶上新的消息*矢量,抱歉。我已经编辑了一些答案。 – carlosdc 2014-09-22 03:34:16
的问题是在这里:
vector<Message> messageList = database.at("user1");
messageList.push_back(new Message("subject", request, request.size()));'
你messageList
是包含Message
类实例的向量。 new
运算符返回一个指向类的指针,因此您试图将指针推向Message
而不是Message
类实例。
根据你想要做什么,你可以使用Message
类实例的向量,或者指向Message
类实例的指针向量,这两种方法都是错误的,或者是正确的,这一切都取决于它想做什么。
如果您习惯于Java,那么您可能习惯于将所有对象自动视为引用(“Integer”类与“int”基本类型)。 C++没有这样的魔力。 'new'返回一个指针。 [这个问题在SO](http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in?rq=1)可能是进一步阅读的好起点。 – Dan 2014-09-22 03:35:34