当我定义一个类的函数时,我会在其中调用同一个类的另一个函数。但是,当我不输入类名时,它会给出分段错误。检查下面。
标头文件
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;
}
答案 0 :(得分:2)
疯狂猜测...因为您提供的代码没有任何问题......
被调用的函数在基类中声明为virtual
,因此即使声明中没有virtual
关键字,它也是virtual
。
被调用的函数不会访问该对象的任何成员。
您正在无效指针或引用上调用该函数(例如,通过空指针或已经删除的对象。
如果所有这些猜测都是正确的,则使用限定条件会禁止动态调度机制,从而避免取消引用指向vtable的无效指针。代码仍然是错误的(由于上面的第三点),但似乎有效。
解决方案不是通过无效指针或引用来调用成员函数。
答案 1 :(得分: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
添加返回值,您需要显示更多实际代码,因为没有足够的可以正确诊断问题(返回值在那里,有{使用您显示的代码{3}}。
答案 2 :(得分:0)
虽然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 << "fnc1\n";
fnc2( var );
var = -1;
return var;
}
int DomainSolver::fnc2 (int& var)
{
std::cout << "fnc2\n";
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;
}