我有一些看起来像这样的代码:
class MyClass
{
void doSomething(std::string& stringvar) {
// Does something
}}
class AnotherClass
{ /* Some data structure */ }
然后在主程序中,程序员调用
MyClass* Class1;
std::string myString = "something";
AnotherClass* SecondClass;
SecondClass = (*Class1).doSomething(myString);
我的问题是,这是做什么的,因为我定义的指针指向什么都没有,然后设置它的值?它为什么设置值?随机内存插槽?在哪里?在堆栈还是堆?为什么有人创建一个类只是为了写一个做某事的函数?我不太了解MyClass类,doSomething实际上是否可能填充某些数据结构?如果是,那么它是如何以及在哪里它也是一个指向什么的指针?
答案 0 :(得分:4)
正如你所说的那样,这是未定义的行为。这意味着任何事情都可以发生。 可能发生的事情的一个就像程序员想要的那样工作。如果doSomething
是非虚函数,并且不访问任何类(非静态)成员变量,则特别有可能。
这仍然是未定义的行为。一旦你改变完全不相关的东西,它就会停止工作。
如果我的诊断是正确的,解决方案是使doSomething
成为静态成员函数,并将其调用为:
secondVar = MyClass::doSomething(mystring);
答案 1 :(得分:3)
我定义的指针指向什么,然后设置它的值?它为什么设置值?随机内存插槽?在哪里?在堆栈或堆中?
嗯,相当。没有答案。从字面上看,结果是不确定的。它could向我的右眼发射电磁脉冲。
为什么有人创建一个类只是为了写一个能做某事的函数?
存在无能。
我真的不了解MyClass类,doSomething是否可能实际上填充了某些数据结构?
这是可能的,但我们不能在没有看到它的情况下告诉你。
如果是,那么如果它也是指向什么的指针的方式和位置?
有些人认为他们可以通过狡猾的指针调用成员函数,只要他们不使用任何成员变量,因为“它对我有用”。
那些人错了。该程序有不确定的行为。
我曾经和那些习惯性地使用静态成员函数的人一起工作,因为他们不知道你可以(应该)写Class1::doSomething(myString)
代替!