вызов функции внутри класса Stack Overflow

В том же классе у меня есть

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';
}

}

В последнем бите первого кода, как мне вызвать функцию печати из второго кода? Они находятся в одном классе, и я не хочу путать вызов его с функцией печати, вызываемой из другого класса во второй части.

2

Решение

Короче говоря, здесь нет проблем с вызовом метода 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
}
3

Другие решения

Если вы хотите быть АБСОЛЮТНО уверены, что вызываете свою собственную функцию, вы можете использовать this ключевое слово, если это не статическая функция или имя класса, если оно статическое.

this->print(...); или же Executive::print(...);

1

Вы можете просто полностью определить функцию-член для вызова:

Executive::Executive(std::istream& fin)
{
// ...
if(directive == "print")
{
Executive::print(x);
}
// ...
}

Я должен отметить, что если вы добавляете нестатический print метод к другому разные класс, здесь нет шансов на столкновение имен. Это связано с тем, что для вызова этого метода извне его содержащего класса вам нужно обратиться к некоторому экземпляру, чтобы вызвать его.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector