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 行,函数incMsgClass是否在字符串上执行message_fr_client并返回结果(和修改)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
4

4 回答 4

0

At line 4, is the function incMsgClass being performed on the string message_fr_client

Yes

and returning the resultant (and modified) message_processed?

Whatever it's returning, you're ignoring the return value. It can modify the object itself, yes, because the function is not const.

At line 5, the function priority_check is being performed on the message_processed and returning a boolean?

Yes

In my class definition, I have a function getPath that is meant to modify the value of nodePath - is it just a matter of using message_processed.getPath(/arguments/)?

If a member function is intended to modify one of the class members, it's just a matter of not marking that function const

于 2013-03-26T09:17:53.720 回答
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都可以修改调用它们的对象。因此,您不需要显式传递此对象。对于函数,可以通过 name 获得指向它们所调用对象的指针this。此外,函数可以访问所有类变量,就好像这些变量对于普通(非成员)函数是全局的一样。

于 2013-03-26T09:21:50.780 回答
0

没有实现细节很难说,但我们开始吧:

I. 您正在传递一个std::stringas 值(默认情况下,C++ 是按值调用),因此您std::string在方法中获得了一个副本。如果要处理传递的对象并对其进行操作,请在对象上使用引用,例如

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

然后您可以将您的签名更改为

void incMsgClass(std::string& original_msg);

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

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

三、node_path只能作为会员才能看到。

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

于 2013-03-26T09:19:48.990 回答
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参数。

于 2013-03-26T09:20:39.967 回答