класс — Использование функции друга в переполнении стека

Просто прочитайте о функциях друзей, и я пытаюсь получить доступ к закрытой переменной «номер» в классе А с помощью функции друга «Печать» из класса В. Я работаю с 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();
}

2

Решение

… Во-вторых, вам может понадобиться предварительное объявление класса B в A.h заголовочный файл для ссылки B как друг:

#ifndef _A_H_
#define _A_H_
class B;

class A
{
friend class B;
};
#endif

ОБНОВИТЬ
В настоящее время я не уверен, можно ли объявить функции-члены друзьями, я посмотрю.

Невозможно создать функцию-член friend объявлений, вы можете объявить глобальные функции или целые классы как друзей, см. также: C ++ ref, Дружба и наследство.

В общем, это не очень хорошая идея для дизайна friend вообще, потому что это сильно связывает классы вместе. Лучшим решением будет пара интерфейсов (которые не должны быть публично видимыми в любом случае).
В редких случаях это может быть хорошим дизайнерским решением, но это почти всегда относится к внутренним деталям.

3

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

Сначала нужно поставить

#ifndef A_H
#define A_H
.... your A-class definition
#endif

в вашем A.h и аналогично в B.h, так что предотвращается многократное включение одного и того же файла (это ваша ошибка определения дубликата) …

1

По вопросам рекламы [email protected]