У меня много проблем с моим кодом C ++, но я не могу понять, почему.
Я занимаюсь разработкой статической библиотеки libmylib.a, которая содержит myclass.h и myclass.cpp.
Проблема у меня такая:
// myclass.h
class myClass{
public:
myclass();
myclass(a,b);
// some methods.
private:
int a ;
int b ;
};
В myclass.cpp я определяю методы конструкторов и т. Д., И т. Д., И все работает нормально:
Я могу использовать библиотеку в моем коде main.cpp.
Затем я добавил функцию друга:
// myclass.h
class myClass{
public:
myclass();
myclass(a,b);
friend void foo() ;
// some methods.
private:
int a ;
int b ;
};
Я определяю функцию foo в myclass.cpp следующим образом
// myclass.cpp
void foo(){
cout << "In foo function " ;
}
Проблема в том, что если я пытаюсь использовать foo () в main.cpp, я получаю ошибку компиляции, которая гласит:
//main.cpp
#include "myclass.h" // foo() is declared here!
foo() ;
main.cpp: 62: 6: ошибка: «foo» не был объявлен в этой области
Теперь я действительно не могу понять, где проблема.
Я заметил, что после добавления функции друга кажется, что компоновщик больше не использует mylib, но я не могу понять, почему. Более того, это странно, потому что, если я прокомментирую foo () в main.cpp, myclass и его методы могут быть использованы без проблем.
Что я делаю неправильно? Я провел два часа, пытаясь понять, но на самом деле не могу понять !!!
Решение: следуя совету в ответе:
// myclass.h
void foo() ; // the function has to be declared outside the class
class myClass{
public:
myclass();
myclass(a,b);
friend void foo() ; // but here you have to specify that
// is a friend of the class!
// some methods.
private:
int a ;
int b ;
};
Это не ошибка компоновщика, это ошибка компилятора. Компилятор говорит вам, что не знает, как вызывать функцию foo
потому что ему не хватает своего определения или декларации.
Объявление функции в качестве друга не заменяет правильное объявление. Когда ты сказал foo
это друг, ты тоже не представляешь foo
в сферу. В каком-то смысле объявление дружбы — это частная деталь вашего класса, невидимая извне.
Чтобы использовать функцию в C ++, вам нужно сначала объявить ее. Обычно это делается через заголовочный файл, соответствующий файлу реализации, но вы можете сделать это просто так:
void foo ();
Если foo
определяется в том же файле, что и main
, вы можете двигаться foo
впереди main
чтобы решить проблему (просмотр определения функции перед первым использованием в порядке с компилятором).
Вы объявили foo
перед его использованием:
#include "header_where_foo_is_declared.h"int main()
{
foo();
}
или же
void foo();
int main()
{
foo();
}
???