当我定义一个类的函数时,我在其中调用同一类的另一个函数。但是当我不输入类名时,它会给出分段错误。请在下面查看。
头文件
class DomainSolver
{
int fnc1 (UserDefinedType & var);
int fnc2 (UserDefinedType & var);
};
C 文件
int DomainSolver::fnc2 (UserDefinedType & var)
{
return 0;
}
int DomainSolver::fnc1 (UserDefinedType & var)
{
// fnc2 (var); // does not work
DomainSolver::fnc2(var); // works
return 0;
}
胡乱猜测...由于您提供的代码没有任何问题...
-
被调用的函数在基类中声明
virtual
,因此即使此处的声明中不存在virtual
关键字,它也virtual
。 -
被调用的函数不访问对象的任何成员。
-
您正在对无效的指针或引用(例如,通过空指针或已删除的对象)调用该函数。
如果所有这些猜测都是正确的,则限定的使用会抑制动态调度机制,从而避免取消对 vtable 的无效指针的引用。代码仍然错误(由于上面的第三点),但它似乎有效。
解决方案是不通过无效的指针或引用调用成员函数。
尽管正如 Zac 的回复所指出的那样,您呈现它们的函数格式不正确,但调用作用域版本之间应该没有区别; 如果您在一种情况下遇到段错误而不是另一种情况,则可能是因为其他地方的代码。
下面是一个工作正常的示例:
dsolver.hh
#ifndef DSOLVER_HH
#define DSOLVER_HH
class DomainSolver
{
public:
int fnc1 (int& var);
int fnc2 (int& var);
};
#endif
dsolver.cc
#include <iostream>
#include "dsolver.hh"
int DomainSolver::fnc1 (int& var)
{
std::cout << "fnc1n";
fnc2( var );
var = -1;
return var;
}
int DomainSolver::fnc2 (int& var)
{
std::cout << "fnc2n";
var = 100;
return var;
}
main.cc
#include <iostream>
#include "dsolver.hh"
int main()
{
DomainSolver my_dsolver;
int my_int = 5;
my_dsolver.fnc1(my_int);
return 0;
}
假设这接近您的实际代码,那么您在fnc1
中有未定义的行为:
int DomainSolver::fnc1 (UserDefinedType & var)
{
// fnc2 (var); // does not work
DomainSolver::fnc2(var); // works
// missing return!!!
}
你声明它返回一个int
,但从不返回任何内容(在任何一种情况下)。 这两种情况都是 UB,因此它们所做的任何事情在技术上都是"有效的",因为您的代码不是。
此代码应为:
int DomainSolver::fnc1 (UserDefinedType & var)
{
return fnc2 (var);
}
作为旁注:这是一个很好的例子,说明为什么你永远不应该忽略编译器给出的警告(因为你应该在两个版本中都收到警告)。
编辑
随着您的最新编辑将返回值添加到fnc1
,您需要显示更多实际代码,因为没有足够的代码来正确诊断问题(返回值在那里,您显示的代码没有任何问题)。