объявление друга в C ++ - PullRequest
3 голосов
/ 04 мая 2010

В книге «Мышление в C ++» Брюса Эккеля приведен пример, относящийся к функциям друзей, как

// Declaration (incomplete type specification):
struct X;
struct Y {
void f(X*);
};
struct X { // Definition
private:
int i;
public:
friend void Y::f(X*); // Struct member friend
};
void Y::f(X* x) {
x->i = 47;
}

Теперь он объяснил это:

Обратите внимание, что Y :: f (X *) принимает адрес X объект. Это очень важно, потому что компилятор всегда знает, как передать адрес, который имеет фиксированный размер независимо от объекта передается, даже если он не имеет полной информации о размере типа. Если вы попытаетесь передать весь объект, однако, Компилятор должен видеть полное определение структуры X, чтобы знать размер и как его передать, прежде чем он позволит вам объявить функцию такие как Y :: g (X).

Но когда я попробовал

void f(X);  

как объявление в структуре Y, оно не показывает ошибок. Пожалуйста, объясните, почему?

Ответы [ 3 ]

1 голос
/ 04 мая 2010

Хорошо передать незавершенный объект X по значению, хотя во время реализации функции должен быть доступен полный тип X независимо от того, используется ли в действительности объект типа X в функции или нет. Объявление функции все в порядке с неполным объектом в качестве аргумента или возвращаемого типа, за исключением ковариантного возвращаемого типа (для функции-члена), где таким возвращаемым типом должен быть полный тип.

1 голос
/ 04 мая 2010

Типы параметров для объявлений функции могут быть неполными.

Для объявлений членов данных и всех определений , однако, тип должен быть полным:

struct A;
struct B {
    void f(A);   // declaration, fine
    void g(A) {} // error
    A a;         // error
};
0 голосов
/ 04 мая 2010

Проблема в том, что вы изменяете объявление в структуре X.

Итак, внутри структуры X вы говорите компилятору, что структура имеет функцию, которая получает что-то типа X, но подождите минуту, тип X не полностью определен в этой точке!

Вы не можете использовать неполный тип в качестве параметра для функции f, но вы можете использовать адрес неполного типа, то есть X *.

На заметке на сайте для вас будет очень важно повысить коэффициент принятия, чтобы вы получали ответы на свои будущие вопросы и имели важное значение для моего эго, если я получил правильный ответ

...