我没有遇到编译错误就无法创建自定义类

时间:2014-09-22 03:16:08

标签: c++ class compiler-errors

所以,我正在尝试创建一个自定义类,但无法弄清楚如何让它正常工作。以下是我的想法:

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编程,但无论我多少尝试查找我得到的错误或以不同的方式编写代码我都没有成功编译代码。再次感谢。

3 个答案:

答案 0 :(得分:1)

messageList.push_back(new Message("subject", request, request.size()));更改为:

messageList.push_back(Message("subject", request, request.size()));

你有一个消息向量(管理自己的内存),而不是你管理的内存指针向量。

等价地你可以写:

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

答案 1 :(得分:0)

问题在于:

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

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

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

答案 2 :(得分:-1)

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

Message message;

添加它可能就足够了:

Message::Message(){
}

和.h

中的相应声明