Как правильно использовать вложенные классы в C ++?

Я изучаю C ++, и я пытаюсь узнать больше об использовании клавиатуры друзей.

Однако у меня возникают проблемы с использованием вложенных классов в моем заголовочном файле.

Я знаю, что заголовочные файлы должны использоваться только для объявлений, но я не хотел включать в него файл cpp, поэтому я просто использовал заголовочный файл для объявления и сборки.

В любом случае, у меня есть файл main.cpp, который я хочу строго использовать для создания объектов классов и доступа к его функциям.

Однако я не знаю точно, как создать функцию FriendFunctionTest в моем заголовочном файле, где я могу получить к ней доступ в своем исходном файле main.cpp с помощью объекта Class заголовка, потому что я пытаюсь понять ключевое слово «friend».

Вот мой код заголовка:

#ifndef FRIENDKEYWORD_H_
#define FRIENDKEYWORD_H_

using namespace std;

class FriendKeyword
{
public:
FriendKeyword()
{//default constructor setting private variable to 0
friendVar = 0;
}
private:
int friendVar;

//keyword "friend" will allow function to access private members
//of  FriendKeyword class
//Also using & in front of object to "reference" the object, if
//using the object itself, a copy of the object will be created
//instead of a "reference" to the object, i.e. the object itself
friend void FriendFunctionTest(FriendKeyword &friendObj);
};

void FriendFunctionTest(FriendKeyword &friendObj)
{//accessing the private member in the FriendKeyword class
friendObj.friendVar = 17;

cout << friendObj.friendVar << endl;
}

#endif /* FRIENDKEYWORD_H_ */

В моем файле main.cpp я хотел сделать что-то вроде этого:

FriendKeyword keyObj1;
FriendKeyword keyObj2;
keyObj1.FriendFunctionTest(keyObj2);

Но очевидно, что это не сработает, так как main.cpp не может найти функцию FriendFunctionTest в заголовочном файле.

Как мне исправить эту проблему?

И еще раз извиняюсь, я просто пытаюсь выучить C ++ онлайн.

0

Решение

friend Ключевое слово используется только для указания, может ли функция или другой класс иметь доступ к закрытым членам этого класса. Вам не нужно наследование классов или вложенность, потому что FriendFunctionTest это глобальная функция. Глобальные функции не требуют префиксов классов при вызове.

Источник для friend: http://msdn.microsoft.com/en-us/library/465sdshe(v=vs.80).aspx

1

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

Вы действительно говорите о нескольких совершенно разных вещах здесь. Вот примеры для двух из них:

1) «Друзья»:

  • http://www.learncpp.com/cpp-tutorial/813-friend-functions-and-classes/

    // Объявление класса
    Аккумулятор класса {
    частный:
    int m_nValue;
    общественности:
    Аккумулятор () {m_nValue = 0; }
    void Add (int nValue) {m_nValue + = nValue; }

    // Сделать функцию Reset () другом этого класса
    перезагрузка друга (аккумулятор) &cAccumulator);
    };

    // Reset () теперь друг класса Accumulator
    void Reset (Аккумулятор &cAccumulator)
    {
    // И может получить доступ к приватным данным объектов Accumulator
    cAccumulator.m_nValue = 0;
    }

2) «Вложенные классы»:

0

Друг не является участником. Вот хороший пример того, как «друг» используется на практике.

namespace Bar {

class Foo {

public:
// whatever...

friend void swap(Foo &left, Foo &right); // Declare that the non-member function
// swap has access to private section.
private:
Obj1  o1;
Obj2 o2;
};

void swap(Foo &left, Foo &right) {
std::swap(left.o1, right.o1);
std::swap(left.o2, right.o2);
}

} // end namespace Bar

Мы объявили функцию для обмена Foo, которая была бы более эффективной, чем std :: swap, предполагая, что классы Obj1 и Obj2 имеют эффективную семантику перемещения. (Черт возьми, ты быстро с этой зеленой галочкой! :))

Полезно знать, что поскольку подпрограмма подкачки параметризована объектом Foo (в данном случае двумя) и объявлена ​​в том же пространстве имен, что и Foo, она становится частью открытого интерфейса Foo, даже если она не является членом. Механизм называется «аргумент-зависимый поиск» (ADL).

0
А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×