在同一课程中我有
Executive::Executive(std::istream& fin){
std::ifstream dFin(argv[2]);
if(!dFin.is_open()){
std::cout <<"Could not open directives file.";
std::cout <<endl;
}
else{
std::string directive;
dFin >>directive;
int x;
dFin >>x;
if(directive=="print"){
}
和功能
void Executive::print(int i) const{
if(i>MAX_NUM_POLYNOMIALS){
std::cout <<"Sorry, " <<i <<" is not within the known polynomials.";
std::cout <<endl;
}
else{
pNom[i].print(std::cout);
std::cout << i <<'\n';
}
}
在第一个代码的最后一位,如何从第二个代码调用打印功能?它们属于同一类,我不想混淆调用它与第二部分中从另一个类调用的print函数。
答案 0 :(得分:3)
简而言之,在这里直接调用print方法没有问题。下面有一些情况需要考虑。
如果您在其他课程中使用打印方法,则只需使用myAnotherClass.print(...)
。
如果需要从基类显式调用print方法,则可以显式使用基类范围,如底部示例中所示,例如MyBaseClass::print(...)
除非在全局范围内使用print方法或正在使用命名空间,否则无法进行任何冲突是一种简单的情况。
如果它在全局区域中,您可以使用:: print(...)调用它,如果它在命名空间中,您可以使用myNamespace :: print(...)
尽量避免“this-&gt;”不惜一切代价,并将其作为最后的手段。如果您在调用print的方法中有一个'print'argumnt,那么如果由于某种原因无法更改参数名称,则可能是一种情况。
最后,在理论课之后,这里是实例:
Executive::Executive(std::istream& fin){
std::ifstream dFin(argv[2]);
if(!dFin.is_open()){
std::cout <<"Could not open directives file.";
std::cout <<endl;
}
else{
std::string directive;
dFin >>directive;
int x;
dFin >>x;
if(directive=="print") {
print(x); // calling the method of the current class
MyBaseClass::print(x); // calling the method of the base class
myAnotherClass.print(x); // classing the method of a different class
::print(x); // calling print in the global scope
myNamespace::print(x); // calling the method in a dedicated namespace
}
答案 1 :(得分:1)
如果你想绝对确定你正在调用自己的函数,你可以使用this
关键字(如果它不是静态函数)或类名称(如果它是静态的)。
this->print(...);
或Executive::print(...);
答案 2 :(得分:0)
您可以完全限定成员函数来调用:
Executive::Executive(std::istream& fin)
{
// ...
if(directive == "print")
{
Executive::print(x);
}
// ...
}
我应该注意,如果您要将非静态print
方法添加到另一个不同的类,则此处不存在名称冲突的可能性。那是因为要实际从其包含的类之外调用该方法,你必须引用一些实例来调用它。