我正在学习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
}
您能否帮我澄清我的以下假设是否正确?编译器没有显示任何错误,因此我不知道它是否没有错误,或者是否有潜伏在下面的错误。
incMsgClass
执行的函数message_fr_client
并返回结果(并修改)message_processed
?priority_check
上执行函数message_processed
并返回布尔值?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 :(得分: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_check
和route_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
获得指向它们的对象的指针。此外,函数可以访问所有类变量,就像这些变量对于普通(非成员)函数是全局的一样。