Просто прочитайте о функциях друзей, и я пытаюсь получить доступ к закрытой переменной «номер» в классе А с помощью функции друга «Печать» из класса В. Я работаю с Visual Studio. Компиляция моего кода дает мне множество различных ошибок, таких как:
C2011: переопределение типа «A»: «класс»
C2653: «B»: не является именем класса или пространства имен
Пожалуйста, будьте терпеливы со мной и покажите правильный способ достижения моей цели.
Вот мои файлы
хиджры:
class A
{
public:
A(int a);
friend void B::Print(A &obj);
private:
int number;
};
a.cpp:
#include "A.h"
A::A(int a)
{
number=a;
}
B.h:
#include <iostream>
using namespace std;
#include "A.h"class B
{
public:
B(void);
void Print(A &obj);
};
B.cpp:
#include "B.h"
B::B(void){}
void B::Print(A &obj)
{
cout<<obj.number<<endl;
}
main.cpp:
#include <iostream>
#include <conio.h>
#include "B.h"#include "A.h"
void main()
{
A a_object(10);
B b_object;
b_object.Print(A &obj);
_getch();
}
… Во-вторых, вам может понадобиться предварительное объявление класса B
в A.h
заголовочный файл для ссылки B
как друг:
#ifndef _A_H_
#define _A_H_
class B;
class A
{
friend class B;
};
#endif
ОБНОВИТЬ
В настоящее время я не уверен, можно ли объявить функции-члены друзьями, я посмотрю.
Невозможно создать функцию-член friend
объявлений, вы можете объявить глобальные функции или целые классы как друзей, см. также: C ++ ref, Дружба и наследство.
В общем, это не очень хорошая идея для дизайна friend
вообще, потому что это сильно связывает классы вместе. Лучшим решением будет пара интерфейсов (которые не должны быть публично видимыми в любом случае).
В редких случаях это может быть хорошим дизайнерским решением, но это почти всегда относится к внутренним деталям.
Сначала нужно поставить
#ifndef A_H
#define A_H
.... your A-class definition
#endif
в вашем A.h и аналогично в B.h, так что предотвращается многократное включение одного и того же файла (это ваша ошибка определения дубликата) …