В том же классе у меня есть
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. Ниже приведены некоторые сценарии для рассмотрения.
Если у вас есть метод печати в другом классе, вы просто используете myAnotherClass.print(...)
,
Если вам нужно явно вызвать метод печати из базового класса, вы можете явно использовать область действия базового класса, как показано в примере внизу, например: MyBaseClass::print(...)
Это простой случай, когда вы не можете столкнуться, за исключением случаев, когда у вас есть метод печати в глобальной области или используемое пространство имен.
Если он находится в глобальной области, вы должны вызывать его с помощью :: print (…), а если он находится в пространстве имен, вы можете использовать myNamespace :: print (…)
Старайтесь избегать «это->» любой ценой и оставьте это в качестве последнего средства. Если у вас был аргумент ‘print’ в методе, где вы вызываете print, это может быть одним из случаев, если вы не можете изменить имя аргумента иначе по какой-либо причине.
Наконец, после теоретического урока, вот практический пример:
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
}
Если вы хотите быть АБСОЛЮТНО уверены, что вызываете свою собственную функцию, вы можете использовать this
ключевое слово, если это не статическая функция или имя класса, если оно статическое.
this->print(...);
или же Executive::print(...);
Вы можете просто полностью определить функцию-член для вызова:
Executive::Executive(std::istream& fin)
{
// ...
if(directive == "print")
{
Executive::print(x);
}
// ...
}
Я должен отметить, что если вы добавляете нестатический print
метод к другому разные класс, здесь нет шансов на столкновение имен. Это связано с тем, что для вызова этого метода извне его содержащего класса вам нужно обратиться к некоторому экземпляру, чтобы вызвать его.