Нужно ли объявлять функции где-либо еще, кроме как в классе и перед программой?

#c #xcode #c 11

#c #xcode #c 11

Вопрос:

Я пытался убедить себя, что объекты одного и того же типа имеют доступ к закрытым элементам данных друг друга. Я написал некоторый код, который, как я думал, поможет мне лучше понять, что происходит, но теперь я получаю сообщение об ошибке от XCODE7 (всего 1), в котором говорится, что я использую необъявленный идентификатор «комбинация».

Если бы кто-нибудь мог помочь мне понять, где я ошибся в своем коде, я бы с удовольствием поучился.

Мой код должен просто печатать false , если выполняется правильно.

 #include <iostream>
using std::cout;
using std::endl;

class Shared {
public:
    bool combination(Sharedamp; a, Sharedamp; b);
private:
    int useless{ 0 };
    int limitless{ 1 };
};

bool Shared::combination(Sharedamp; a,Sharedamp; b){
    return (a.useless > b.limitless);
}

int main() {

    Shared sharedObj1;
    Shared sharedObj2;

    cout << combination(sharedObj1, sharedObj2) << endl;

    return 0; 
}
  

Ответ №1:

combination является функцией-членом класса Shared . Следовательно, он может быть вызван только для экземпляра Shared . Когда вы вызываете combination , вы не указываете, какой объект вы называете его одним:

 cout <<    combination(sharedObj1, sharedObj2) << endl;
        ^^^
       Instance?
  

Компилятор жалуется, потому что думает, что вы хотите вызвать вызываемую функцию combination , но ее нет.

Итак, вам нужно указать экземпляр:

 cout << sharedObj1.combination(sharedObj1, sharedObj2) << endl;
  

Однако в этом случае не имеет значения, в каком экземпляре он вызывается, поэтому вы должны сделать combination static , чтобы вы могли сделать

 cout << Shared::combination(sharedObj1, sharedObj2) << endl;
  

Комментарии:

1. Супер ответ. Спасибо за этот совет в конце. Отличное объяснение со всех сторон.