2013-03-26 37 views
0

我正在学习C++,在使用类时非常新,在尝试使用它们时我感到非常困惑。我试图转换我现有的代码(它使用了结构),以便它使用类 - 所以当我知道我在做什么时,我不知道我是否正确地做了它。使用类功能

有人告诉我,当使用类中的函数时,我首先需要实例化类的一个对象。所以我在我的主要功能中尝试过(一个片段)是:

int main()// line 1 
{ 
    string message_fr_client = "test"; //line2 

    msgInfo message_processed; //line 3 
    message_processed.incMsgClass(message_fr_client); //line 4 

    if (!message_processed.priority_check(qos_levels, message_processed)) //line 5 
     cout << "failure: priority level out of bounds\n"; //line 6 

    return 0; //line 7 
} 

你能帮我澄清一下,我的下列假设是正确的吗?编译器没有显示任何错误,所以我不知道它是否没有错误,或者是否有潜在的错误。

  1. 在第4行中,对字符串message_fr_client正在执行的功能和incMsgClass返回所得到的(改性)message_processed
  2. 在第5行,函数priority_check正在message_processed上执行并返回一个布尔值?
  3. 在我的班级定义中,我有一个功能getPath,意思是修改nodePath的值 - 这仅仅是使用message_processed.getPath(/*arguments*/)的问题吗?

我没有包括的功能的身体,因为我知道他们的工作 - 我只是想找出如何类的功能进行交互。请让我知道,如果我可以更清楚 - 只是想澄清一些混淆。

这是我的类:

#ifndef clientMsgHandling_H 
#define clientMsgHandling_H 

#include <list> 
#include <map> 
#include <queue> 

class msgInfo 
{ 
public: 
    msgInfo(); 
    msgInfo(int, int, int, std::string, std::list<int>); 

    /*classifying message*/ 
    msgInfo incMsgClass(std::string original_msg); 

    /*message error checks*/ 
    bool priority_check(int syst_priority, msgInfo msg); //check that message is within qos levels 
    bool route_check(std::map<std::pair<int, int>, int> route_table, msgInfo msg); //check that route exists 

    void getPath(msgInfo msg, std::map<std::pair<int, int>, int> route_info, int max_hop); 

private: 
    int source_id; 
    int dest_id; 
    int priority; 
    std::string payload; 
    std::list<int> nodePath; 
}; 

#endif 
+0

对不起,我不能接受多个答案,但谢谢大家! - 所有位和bobs帮助 – sccs 2013-03-27 07:25:33

回答

0

虽然它可能编译(甚至运行),有与代码的一些古怪如图所示: -

首先,类方法知道哪个对象,他们正在操作 - 让你的priority_checkroute_check可能方法不需要msgInfo作为参数,

例如,旧的非类函数可能是这样的

bool priority_check(int p, msgInfo msg) 
{ 
    return msg.priority < p; 
} 

但新的一个应该是这样的:

bool msgInfo::priority_check(int p) 
{ 
    return priority < p; 
} 

另外,incMsgClass有点奇怪,因为它是一个非静态类方法,它返回一个msgInfo对象。不理解它应该做什么很难说,但这个函数似乎应该是一个构造函数,而不是一个常规方法。

另一件事是,您正在向这些方法传递值为的msgInfo 。所以如果该方法需要修改传递的msgInfo,它不会有任何影响。通过引用或const引用传递对象通常更好。所以,回到以前的非方法示例,它应该是这样的。

bool priority_check(int p, const msgInfo &msg) 
... 

但是,正如我说的,你可能不需要msgInfo参数反正。

+0

只是澄清 - 我刚刚改变它看起来像'bool msgInfo :: priority_check(int p){}',这是否意味着当我使用'message_processed。 priority_check(x)',它会知道检查'message_processed'是否满足该条件,这就是为什么我不必将它作为参数传递的原因? – sccs 2013-03-26 09:32:03

+0

是的:'引擎盖下',当一个对象的方法被调用时,一个指向该对象的指针被作为一种隐藏的参数传递给'this'。所以当你写'priority'时,它与'this-> priority'相同。你使用'std :: string',所以看看'length()'是如何定义的。 – Roddy 2013-03-26 10:33:23

0

在第4行,是对字符串message_fr_client

正在执行incMsgClass功能并返回所得到的(并修改)message_processed?

无论返回什么,你都忽略了返回值。它可以修改对象本身,是的,因为该函数不是const。

在第5行,函数priority_check正在对message_processed执行并返回一个布尔值?

在我的类定义,我有一个函数的getPath,是为了修改的NodePath的价值 - 它只是一个用message_processed.getPath的事(/ 参数 /) ?

如果一个成员函数旨在修改类的成员之一,它只是一个没有标记这个函数常量

+0

对于第1点,如果我做了'message_processed = message_processed.incMsgClass(message_fr_client);'而不是原始的,那意味着'message_processed'现在已被修改? – sccs 2013-03-26 09:19:54

+0

@SCCS:如果incMsgClass实际上修改了message_processed,那么它是一样的。在你的评论中的解决方案只是一个低效率的复制 – 2013-03-26 09:51:27

0

很难说没有实施细节的问题,但在这里我们去:

I.您正在传递std::string作为值(C++默认为按值呼叫),因此您会在方法中获得std::string的副本。如果你想给你传递的对象上工作,并对其进行操作,使用对象的引用,像

msgInfo incMsgClass(std::string& original_msg); // notice the ampersand 

那么您可以将您的签名更改为

void incMsgClass(std::string& original_msg); 

因为你并不需要返回您通过的std::string

二,是的,至少根据您的签名

三。只能看到node_path作为成员。

有关您的所有问题,请参阅C++-FAQ

0

您的基本假设是正确的。

message_processed.incMsgClass(message_fr_client); //line 4 

此行不正确。您致电的功能将返回msgInfo,该功能将被简单地删除。你应该把它分配给某个东西。但它不像通常那样。你应该让msgInfo的构造,就像

class msgInfo 
{ 
public: 
    msgInfo(std::string original_msg); 
... 
} 

然后,你可以这样调用

msgInfo message_processed(message_fr_client); 

这条线将创建一个已经正确初始化一个msgInfo。

还有另一种创建类实例的模式 - 静态创建函数。你的情况,你可能标志着incMsgClass静态,然后调用它像

msgInfo message_processed = msgInfo.incMsgClass(message_fr_client); 

我严重怀疑你在这里需要这种模式,所以我建议移动到构造函数。

至于其他功能,我没有看到那里的问题。请注意,没有标记为const的所有成员函数都可以修改它们被调用的对象。所以,你不需要明确地传递这个对象。对于函数,指向它们被调用的对象的指针可以按名称this提供。此外,函数可以访问所有类变量,就像这些变量对于普通(非成员)函数是全局变量一样。