使用类中的函数

时间:2013-03-26 09:12:45

标签: c++ class

我正在学习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*/)的问题吗?
  4. 我没有包含函数体,因为我知道它们有效 - 我只想找出类函数如何交互。如果我能更清楚,请告诉我 - 只是想在这里澄清一些困惑。

    这是我的班级:

    #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 个答案:

答案 0 :(得分:0)

  

在第4行,是对字符串message_fr_client执行的函数incMsgClass

  

并返回结果(和修改过的)message_processed?

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

  

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

  

在我的类定义中,我有一个函数getPath,用于修改nodePath的值 - 是否仅仅是使用message_processed.getPath(/ arguments /)?

如果成员函数旨在修改其中一个类成员,那么只需要标记该函数const

答案 1 :(得分:0)

很难说没有实施细节,但我们走了:

予。您传递std::string作为值(默认情况下C ++是按值调用),因此您可以获得方法中std::string的副本。如果要处理传递的对象并对其进行操作,请使用对象上的引用,如

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

然后您可以将签名更改为

void incMsgClass(std::string& original_msg);

因为您不需要返回您传递的std::string

II。是的,至少根据你的签名

III。只能将node_path视为会员。

如果您有任何疑问,请参阅C++-FAQ

答案 2 :(得分: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参数。

答案 3 :(得分: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获得指向它们的对象的指针。此外,函数可以访问所有类变量,就像这些变量对于普通(非成员)函数是全局的一样。