2014-09-22 58 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類實例的指針向量,這兩種方法都是錯誤的,或者是正確的,這一切都取決於它想做什麼。

相關問題