2014-09-22 31 views
0

所以,我想创建一个自定义类,但无法弄清楚如何让它正常工作。以下是我想出了:我不能创建一个自定义的类没有遇到编译错误

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进行编程,但无论我尝试查找错误还是以其他方式编写代码,我都无法编译代码。再次感谢。

+0

如果您习惯于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

回答

1

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());

+0

感谢您指出冗余。我可能会摆脱第三个参数。 – fudge22it 2014-09-22 03:35:40

+0

是的,当我这样做时,编译器说'消息::〜消息()'的未定义引用 – fudge22it 2014-09-22 03:44:12

+0

你声明了析构函数'〜Message();'但尚未为它写入正文。 (实际上你的类不需要任何手动清理资源,因为'string'清理自己了,所以你可以删除那个声明) – 2014-09-22 03:46:10

-1

看来你有各种各样的问题。其中之一是,你需要当你正在被调用默认的构造函数:

Message message; 

增加,这将可能就够了:

Message::Message(){ 
} 

和相应的声明中.H

+0

问题不在于构造函数,而在于向量中的类型不匹配。 – 2014-09-22 03:30:08

+0

没有赶上新的消息*矢量,抱歉。我已经编辑了一些答案。 – carlosdc 2014-09-22 03:34:16

0

的问题是在这里:

vector<Message> messageList = database.at("user1"); 
messageList.push_back(new Message("subject", request, request.size()));' 

messageList是包含Message类实例的向量。 new运算符返回一个指向类的指针,因此您试图将指针推向Message而不是Message类实例。

根据你想要做什么,你可以使用Message类实例的向量,或者指向Message类实例的指针向量,这两种方法都是错误的,或者是正确的,这一切都取决于它想做什么。

相关问题