Вопросы с тегами [friend-class]

16

голосов
4

ответ
887

Просмотры

Why can I not instantiate a class whose constructor is private in a friend class?

У меня есть два класса; Заработная плата, предназначенная для хранения информации и расчетов относительно заработной платы работника и работника, который имеет объект класса типа Зарплата и некоторые члены, как имя и адрес сотрудника ... То, что я хочу сделать, это предотвратить класс Зарплата от того, инстанцирован кроме класса Employee. Поэтому я объявил строитель заработной платы частного и сделал Работник друг Зарплата. Но я получаю ошибки: класс Employee; класс Зарплата {общественности: частная: Зарплата (): revenue_ {}, cost_ {} {} Зарплатный (интермедиат х, у ИНТ): revenue_ {х}, cost_ {у} {} ИНТ revenue_, cost_; друг класс Employee; }; класс Employee {общественности: станд :: строка name_; Зарплата сала; }; INT основных () {Сотрудник EMP {}; // "Зарплата :: Зарплата ()" недоступен} Проблема уходит, если я вперед объявить основной: INT основной (интермедиат, символ * []); И сделать главный друг класса Зарплата как и в Оклад: класс Зарплата {// ... друг Int основной (INT ARGC, символ * ARGV []); }; Теперь программа компилируется правильно! *** Еще одна вещи, в основном, если я объявить объект так: Employee ую; // ОК эми Сотрудник {}; // ошибка?
Syfu_H
1

голосов
3

ответ
340

Просмотры

Функция друга и включают в себя цикл

У меня есть проблема с функцией друга между двумя классами. Давайте посмотрим код: Первый класс: #ifndef _FIRST_H_ #define _FIRST_H_ // # включить "Second.h" класс #include второй; Класс Первого {друг аннулируется Второе :: весело (); станд :: строка ул = "Dziala \ п"; общественности: Во-первых (); ~ Во-первых (); }; #endif и второй класс: #ifndef _SECOND_H_ #define _SECOND_H_ #include #include "First.h" класс Второй {Первый fObj; общественности: Второй (); ~ Во-вторых (); пустота весело () {станд :: соиЬ
QueUe
1

голосов
3

ответ
621

Просмотры

как связать два шаблонных классов во многих ко многим дружбой?

Предположим, что у меня есть следующие два класса шаблона: шаблон класса First {частное: Int А; }; шаблонный класс Второй {частное: ИНТ б; }; как я могу связать их в многие-ко-многим дружбы. например, добавление метода в первом, который печатает б объекта параметра второго. мой вопрос ясно?
Tamer Shlash
1

голосов
1

ответ
3.7k

Просмотры

Может ли друг класс вызвать частный конструктор в C ++? (И что Singleton)

Рассмотрим класс А и В. Класс А подружился класса B. Класс B имеет закрытый конструктор. Может класса А создавать экземпляры класса B, или частный конструктор указывает компилятору, что класс не может быть обработан, даже классом друга? Вот некоторые примеры кода: класс B; класс А {аннулируются туРипсЫоп () {B newBobject; }}; класс B {частное: B () {} общественности: INT someData; друг класса А; }; Кроме того, обратите внимание, я использую C ++ 03. Если это не действует в C ++ 03, это разрешено в C ++ 11? В качестве побочного вопроса, как связан метод Singleton? Имеет ли дело, что конкретно инстанцировании один и только один экземпляр объекта, или что-то еще?
Codesmith
0

голосов
2

ответ
29

Просмотры

Сделайте все производные классов шаблонного друг другого класса в C ++

Скажем, у меня есть к следующей иерархии: шаблон класса Base {защищенный: T контейнер; }; шаблонный класс Derived1: открытая база {общественность: недействительный f1 () {/ * Есть ли вещи с базой :: контейнер * /}}; шаблонный класс Derived2: открытая база {общественность: недействительный f2 () {/ * Есть ли вещи с базой :: контейнер * /}}; Теперь я хочу, независимый класс (не производный от базы), которые могут получить доступ к базовой :: контейнера непосредственно из базы или любого производного класса. Я читал о шаблонных других классах, и кажется, что решение моей проблемы, но я не мог понять синтаксис еще. Я ищу что-то вроде: шаблонного класса Foo {шаблон друга класса Base; //
TKr
1

голосов
3

ответ
256

Просмотры

Есть ли способ, чтобы сделать все производные классы друзей друг от друга?

И если да, то в какой ситуации может ли это быть полезным? Или (и я думаю, что это так), почему это абсолютно бесполезно? (Что другой подход по существу охватывает способности, предоставляемые такой дружбы, но в более безопасной и менее дырявой образом?) Я был в ситуации, когда я почти подумал, что мне нужна такая вещь. Я пошел после того, как совершенно другой дизайн, в конце концов, что делает все члены класса статичным. Я до сих пор интересно, хотя.
Andrew Cheong
2

голосов
2

ответ
935

Просмотры

Используя функцию друга в C ++

Просто читать о другом функции, и я пытаюсь получить доступ к частной переменной «число» в классе А с другом функции «Печать» из класса B. Я работаю с Visual Studio. Составление моего кода дает мне много различных ошибок, как: C2011: «A»: «Класс» Тип переопределение C2653: «B»: не является именем класса или пространства имен Пожалуйста, будьте терпеливы со мной со мной и показать правильный путь достижения моей Цель. Вот мои файлы А: класс А {общественности: A (Int А); друг аннулируются B :: Печать (A & объект); частные: INT число; }; A.cpp: #include "А" A :: A (Int А) {число = а; } Bh: #include с помощью патезрасе; #include "Ah" класса B {общественности: B (недействительным); недействительным печати (А & OBJ); }; B.cpp: #include "Bh" B :: B (недействительными) {} пустоты B :: печати (А & OBJ) {соиЬ
QED
17

голосов
5

ответ
39.3k

Просмотры

Что такое эквивалент «друг» ключевое слово в C Sharp?

Что такое эквивалент «друг» ключевое слово в C Sharp? Как использовать «внутренний» ключевое слово? Я прочитал, что «внутреннее» ключевым словом является заменой для «друга» в C #. Я использую DLL в моем C # проекта, у меня есть исходный код и все же я не хочу, чтобы изменить существующий код. Я унаследовал класс и я могу использовать мой класс наследуется каким-либо образом я хочу. Проблема заключается в том, что большая часть кода в родительском классе защищала методы. Будет ли с помощью друга каким-то образом сделать возможным доступ или вызвать эти защищенные методы?
xarzu
1

голосов
2

ответ
561

Просмотры

Перегрузка операторов как друга

У меня есть идея об использовании друга слова, чтобы получить доступ к частным членам, кроме собственного класса. Например, у меня есть класс А и необходимо получить доступ к частному методу атрибута, который класс B внутри метода ИИ может объявить метод как друга. Тем не менее, см следующий код: #include класс Корд {личное: Int х, у; общественности: Coord (интермедиат i1, i2 ИНТ): х (i1), у (i2) {} другу Корд operator- (Coord сопзЬ & c1, Coord сопзЬ & c2) {вернуться Корд (c1.x-c2.x, c1.y -c2.y); } Coord абс () {вернуть COORD (Std :: ABS (х), станд :: абс (у)); }}; Какая польза может стать перегрузкой operator- как друг? Я действительно не понимаю, почему кто-то может быть интересно. Я много читал об этом, но я не получил четкое представление. Может кто-нибудь написать небольшой пример, где я могу наблюдать тот факт?
dmayola
1

голосов
2

ответ
270

Просмотры

Определение СТЛ контейнер для класса, который только что был объявлен.

Я пытаюсь реализовать конечный код элемента для моего исследования. Мне нужно, чтобы создать карту, которая связывает материалы с их именами, так что я могу получить доступ к ним по имени. Из заголовка файла основного класса, я определяю следующее: /// определение Friend класса для материалов друг класса материалов; /// Определение класса для материалов класса материалов; /// Создает словарь elementsets против имен материалов стандов :: Карта _material_assignment; /// Контейнер для хранения материалов имен все станда материалов :: карта _materials; Реализация основного класса компилирует. Однако, когда Makefile достигает основной файл, я получаю следующее сообщение об ошибке об ошибке: «станд :: пара :: второй» имеет неполный тип _T2 второй; /// @c второй является копией второго объекта ^ В файле включены из SRC / main.c: 5: 0: ЦСИ / diff_code.h: 228: 9: ошибка: вперед декларация «класса DiffCode :: Материал» Класс материала; Как это обойти. Все остальные файлы моего кода, который все включает файл заголовка для важного класса кодовой компиляции. Спасибо!
6

голосов
1

ответ
248

Просмотры

Шаблон Friend Класс: Вперед Декларация или ...?

Предположим, у меня есть класс шаблона, который я пытаюсь объявить как класс другу. Должен ли я вперед объявить класс или дать ему свой собственный шаблон? Пример: шаблон класса SLinkedList; шаблонный класс SNode {частное: E эль; SNode * следующий; друг класса SLinkedList; }; Или класс шаблона SNode {частное: E эль; SNode * следующий; шаблон друг класса SLinkedList; };
badfilms
19

голосов
3

ответ
56.4k

Просмотры

«друг» функция и

В проекте я работаю, у меня есть класс Score, определенный ниже в score.h. Я пытаюсь перегружать его так, когда
Francisco P.
2

голосов
1

ответ
170

Просмотры

C ++: как сделать группу производных классов иметь доступ к закрытым членам одного класса?

Предположим, что класс: библиотека И у нас есть группа производного класса от базового класса LibraryCustomer, таких как: Kid, родитель, студент, и т.д. В классе библиотеки, есть группа (т) частных членов переменных. Поскольку существует огромное количество частных членов в классе библиотеки, я не хочу использовать геттер и сеттер, которые являются утомительными. Плюс LibraryCustomer производных классов часто ссылаются на эти член. Getter и Setter не удобно. Для того, чтобы эти LibraryCustomers доступа к этим закрытому члену в библиотеке, я должен требовать этих LibraryCustomers как друг классы в библиотеке. Но поскольку производные классы продолжают расти, я не хочу, чтобы добавить их один за другим в библиотеке классов. Добавьте базовый класс LibraryCustomer, как друг в библиотеке, кажется, не работает. Так что это еще один способ лучше? [Update] Я хочу, чтобы получить доступ к тоннам частных переменным членов в классе библиотеки. Поскольку существует много, так что я не хочу использовать геттер и сеттер. Я надеюсь, что полученные классы от LibraryCustomer могут свободно получить доступ к этим закрытым переменным-членам в классе библиотеки.
user1914692
4

голосов
1

ответ
105

Просмотры

Может ли друг класс создавать объекты из своего друга классов в C ++?

Это код внутри моих двух заголовочных файлов C ++, где я объявляю два класса, один друг от друга: ==> Первого класса создает хэш-таблицу и заполняет ее словами из данного файла. #include класс "remove_duplicates.h" Hash_class {защищенный: список * в hashTable; строка input_file; строка output_file; INT input_file_size; друг класса remove_duplicates; // недействительный размер_файл (); общественности: / * нагрузить слова в хэш-таблице; путем вычисления хэш-кода каждой строки * / Hash_class (строка input_file, строки выходной_файл = «output_file.txt»); ~ Hash_class () {fclose (входной_файл); fclose (ouput_file); } INT хэш-код (Const строки input_word); loadInHash недействительными (); write_in_output недействительными (); ИНТ get_input_file_size () {вернуться input_file_size; } Строка get_input_file () {вернуть входной_файл; } Строка get_output_file () {вернуть выходной_файл; }}; Во втором классе я хотел бы создать объект из первого класса и действовать на него, сначала заполняя хэш-таблицу внутри объекта, созданный затем удаляя все слова, которые concidered дубликатов (если расстояние Левенштейн близко к определенной пропорции) , #include remove_duplicates класс "Hash_class.h" {защищен: Hash_class hash_object; общественные: remove_duplicates (Hash_class & hash_object); INT Levenshtein_distance (строка s1, строка s2); set_purge недействительными (); }; Проблема заключается в том, когда я компиляции кода я получаю сообщение об ошибке: ([Error] Hash_class 'не называет тип) Если это возможно, пожалуйста, вы можете сказать мне, как и некоторые источники, где я могу узнать об этом. Если оно' не возможно, то некоторые намеки будет большая вещь, спасибо. ( "Я использую C ++ 4.3.2")
Amin Mag
11

голосов
6

ответ
4k

Просмотры

Использование класса vs. друга добавление аксессоров для модульного тестирования в C ++?

Что лучше добавлять функции, которые возвращают внутреннее состояние объекта для модульного тестирования, в отличие от решений класса тестирования друг? - особенно, когда нет никакой пользы для функций для случая модульного тестирования, за исключением.
bias
12

голосов
5

ответ
5.6k

Просмотры

C # классы Друг и ООП Композиция

Учитывая класс А, который содержит наборы исходных данных, и класс B, который содержит реорганизовано версию (GUI готовой) эти данные я хотел бы, чтобы исходные данные в Видимом в B. Очевидно исходные данные в классе А содержится в частных членов. Я хотел бы сделать эти данные видимыми в B, хотя использование чего-то сродни методу друг классов C ++. Как я могу подойти к этому? Спасибо.
Rire1979
5

голосов
4

ответ
643

Просмотры

Определение секций друг класса и аксессоры

При определении класса как класс друга, это имеет значение, в каком раздел аксесс определение помещаются, и если это так, что это изменение членов друга имеет доступ к? класс aclass {частное: // друг bclass; общественности: // друг bclass; защищенный: // друг bclass; }; Класс bclass {};
Zamfir
3

голосов
1

ответ
49

Просмотры

C ++: предоставить доступ к частному оператору «проходя через» класс друга, возможно?

Скажем, я определил эти два класса: класс Node {список классов друга; общественности: Node (Const INT = 0); Узел (Const Узел &); частные: INT вал; Узел * следующий; Узел и оператор = (Const Узел &); }; список классов {общественности: список (); Список (список Const &); ~ Список (); Список & оператор + = (Const Узел &); Узел & оператор [] (Const целое) Const; частные: Список & delete_Node (Const целое); Узел * первый; ИНТ длина; }; а затем, в файле main.cpp, у меня есть следующие строки: список l1; L1 + = 1; L1 + = 41; l1 [1] = 999; //
grd
13

голосов
2

ответ
6.3k

Просмотры

Объявление пространства имен в другом классе

Мне было интересно, если есть способ, таким образом, что мы делаем все функции, определенные в пределах определенного пространства имен друг с классом? В частности, у меня есть класс, например: класс C {частного: // ... общественность: // ... друг C * B :: f1 (C *); Друг C * B :: f2 (C *); Друг C * B :: f3 (C *); Друг C * B :: f4 (C *); Друг C * B :: f5 (C *); }; и пространство имен В, как: пространства имен B {C * f1 (С * х); С * 2 (С * х); С * f3 (С * х); С * f4 (С * х); С * f5 (С * х); }; Теперь, я бы предпочел, чтобы избежать написания 5 строк в определении класса, чтобы все пять функций друга пространств имен B с классом C и просто сказать компилятору, что все функции, определенные в пространстве имен B являются друзьями с класса С (т.е. может получить доступ к его закрытым членам). Быстрое исправление я думаю, чтобы изменить пространство имен класса и определить функции, как его статические члены, а затем объявить класс B, как друг класс C. Однако, из любопытства мне было интересно, если такая вещь возможна с пространствами имен, как хорошо или нет? Заранее спасибо.
PBM
2

голосов
6

ответ
889

Просмотры

Почему нам нужен «друг» здесь? (C ++)

Зритель QML (для 4.8 и 5.0) осуществляется так: В .h (eader) мы имеем: класс QtQuick2ApplicationViewer: общественный QQuickView {Q_OBJECT ... частный: класс QtQuick2ApplicationViewerPrivate * d; }; Затем в файле .CPP: класс QtQuick2ApplicationViewerPrivate {QString mainQmlFile; друг класса QtQuick2ApplicationViewer; статический QString adjustPath (Const QString & путь); }; QtQuick2ApplicationViewer :: QtQuick2ApplicationViewer (QWindow * родитель): QQuickView (родитель), d (новый QtQuick2ApplicationViewerPrivate ()) {подключения (двигатель (), SIGNAL (бросить курить ()), SLOT (близко ())); setResizeMode (QQuickView :: SizeRootObjectToView); #ifdef двигатель Q_OS_ANDROID () -> setBaseUrl (QUrl :: fromLocalFile ( "/")); #endif} Почему с помощью друга, необходимой здесь? Я не вижу никаких причин, почему бы кто-нибудь использовать класс друга. Есть ли реальная польза для друга классов (для экзотики, что кто-то может жить без, кроме)? .h класс #include QtQuick2ApplicationViewer: общественный QQuickView {Q_OBJECT общественности: явное QtQuick2ApplicationViewer (QWindow * родитель = 0); Виртуальный ~ QtQuick2ApplicationViewer (); аннулированию setMainQmlFile (константный QString & файл); аннулированию addImportPath (константный QString & путь); аннулированию showExpanded (); частный: класс QtQuick2ApplicationViewerPrivate * d; }; .cpp #include "qtquick2applicationviewer.h" #include #include #include класс QtQuick2ApplicationViewerPrivate {QString mainQmlFile; друг класса QtQuick2ApplicationViewer; статический QString adjustPath (Const QString & путь); }; QString :: QtQuick2ApplicationViewerPrivate adjustPath (Const QString & путь) {#ifdef Q_OS_UNIX #ifdef Q_OS_MAC если (! QDir :: isAbsolutePath (путь)) возвращают QString :: fromLatin1 ( "% 1 /../ ресурсы /% 2") .arg (QCoreApplication :: applicationDirPath (), путь); #elif определен (Q_OS_ANDROID) Const QString pathInInstallDir = QString :: fromLatin1 ( "% 1 /../% 2") Arg (QCoreApplication :: applicationDirPath (), путь)!.; если (QFileInfo (pathInInstallDir) .exists ()) возвращают pathInInstallDir; #endif #endif пути возвращение; } QtQuick2ApplicationViewer :: QtQuick2ApplicationViewer (QWindow * родитель): QQuickView (родитель), д (новый QtQuick2ApplicationViewerPrivate ()) {соединить (двигатель (), СИГНАЛ (бросить курить ()), SLOT (близко ())); setResizeMode (QQuickView :: SizeRootObjectToView); #ifdef двигатель Q_OS_ANDROID () -> setBaseUrl (QUrl :: fromLocalFile ( "/")); #endif} QtQuick2ApplicationViewer :: ~ QtQuick2ApplicationViewer () {удалить д; } Недействительного QtQuick2ApplicationViewer :: setMainQmlFile (Const QString & файл) {d-> mainQmlFile = QtQuick2ApplicationViewerPrivate :: adjustPath (файл); setSource (QUrl :: fromLocalFile (D-> mainQmlFile)); } Недействительного QtQuick2ApplicationViewer :: addImportPath (Const QString & путь) {двигатель () -> addImportPath (QtQuick2ApplicationViewerPrivate :: adjustPath (путь)); } Недействительного QtQuick2ApplicationViewer :: showExpanded () {#if определена (Q_WS_SIMULATOR) showFullScreen (); #else шоу (); #endif} addImportPath (QtQuick2ApplicationViewerPrivate :: adjustPath (путь)); } Недействительного QtQuick2ApplicationViewer :: showExpanded () {#if определена (Q_WS_SIMULATOR) showFullScreen (); #else шоу (); #endif} addImportPath (QtQuick2ApplicationViewerPrivate :: adjustPath (путь)); } Недействительного QtQuick2ApplicationViewer :: showExpanded () {#if определена (Q_WS_SIMULATOR) showFullScreen (); #else шоу (); #endif}
Zingam
1

голосов
5

ответ
434

Просмотры

Почему аварии друг класс по вызову статической функции?

# include с помощью патезраса; класс CClass {частный: друг класс CFriend; статической силы privateFunc () {станд :: соиЬ
AudioDroid
2

голосов
2

ответ
1.3k

Просмотры

Access Mysql * connection variable from different c++ class

I wrote c++ class to connect to mysql database: hpp file #include #include #include "mysql/mysql.h" #ifndef _DATA #define _DATA class Database { public: string host; string user; string pwd; string db; MYSQL * connection; MYSQL_RES *result; MYSQL_ROW row; Database(const string & host, const string & user, const string & pwd, const string & db); int createMysqlConnection(); }; #endif cpp file #include "Database.hpp" Database::Database(const string & host, const string & user, const string & pwd, const string & db) : mysqlHost(host), mysqlUser(user), mysqlPassword(pwd), mysqlDBName(db) {} int Database::createMysqlConnection(){ MYSQL * connection; connection = mysql_init(NULL); if(!mysql_real_connect(connection, mysqlHost.c_str(), mysqlUser.c_str(), mysqlPassword.c_str(), mysqlDBName.c_str(), 0, NULL, 0)){ fprintf(stderr, "Connection to database failed: %s\n", mysql_error(connection)); return EXIT_FAILURE; } cout
2

голосов
1

ответ
239

Просмотры

Друзья и вложенные классы

Хорошо я полностью измотан на этом. Кодекс начинает плавать вокруг экрана ... должна спать. Так! Хорошо, смутили вложенными классами и друзьями. вот псевдо-код класса А {общественности: функции // конструктор // член частное: класс B {// частный Int А (); }; класс C {// частный ИНТ б (); }; }; Поэтому, как только объект типа А был создан, я хотел бы, чтобы получить доступ к () и Ь (). Я знаю, что я должен использовать функцию друга для этого. Так, где я должен поставить друг класса А. Это право выражение ?.
Josh
2

голосов
3

ответ
1.1k

Просмотры

Друг Класс В C ++

здесь им не понять концепцию очень хорошо, или я прав .... Так давайте этот «друг» классовый примеру здесь: класс MyClass {друг класс AnotherClass; частные: INT секрет; } Класс AnotherClass {общественности: недействительным getSecret (MyClass тс) {возвращение mc.secret; }} Так да ... в приведенном выше коде это будет на самом деле работает, если вы делаете это ... а вообще, почему вы не можете использовать методы получения и установки все время вместо друга класса? Является ли причиной друг использования класса из-за «занудство»?
amanuel2
1

голосов
2

ответ
129

Просмотры

How to access methods and fields of the nested class from enclosing template class?

Я искал через веб-ап не нашли каких-либо объяснений, почему происходит следующее. Например, есть класс шаблона Вложение с вложенным классом вложенным. В ограждающих класс, существует метод, который должен создать экземпляр вложенного класса и использовать его поля и методы. В следующем коде, есть модель того, как я пытаюсь сделать это: класс шаблона Ограждающим {общественный: класс вложенного; Уплотненный Foo (); }; шаблонный класс :: Вложение Вложенные {общественности: T поле; some_method недействительными (); друг объемлющего класса; // вместо этой линии я также попытался: // друг объемлющего класса // и он не работал ни}; Шаблон имяТип Вложение :: Вложенные Вложение :: Foo () {Вложенные категории; nes.some_method; // проблема здесь появляется вернуться прил; } Проблема: Когда я пишу nes.some_method, ни одна из сред я попробовал (VS2010, затмение), после того, как я типа «NES.», Не предлагает мне любые варианты. Я, кажется, как «NES» не является instanse класса вообще. Как получить доступ к методам и полям вложенного класса из вмещающих шаблонного класса?
Grinch
3

голосов
3

ответ
97

Просмотры

Понимание доступа члена с Наследование / другу класса в C ++

от C ++ праймера 5-е издания: посмотрите на этих классах: класс Base {другого класса Pal; общественности: недействительный pub_mem (); защищенный: INT prot_mem; частные: INT priv_mem; }; Класс Sneaky: общественный Base {частное: Int J; }; класс Pal {общественности: INT f1 (Base б) {возвращение b.prot_mem; // OK, Пал друг класс} ИНТ f2 (подлый S) {возвращение SJ; // ошибка: Pal не друг, J является частным} ИНТ f3 (Трусливый s) {вернуться s.prot_mem; // нормально Пал друг}} Здесь Pal является другим классом Base, в то время как подлый наследует от базы и используются в Pal. Теперь самые последняя строка, где s.prot_mem вызывается, автор дает основание это работает, потому что Пал является другим классом Base. Но то, что я читал до сих пор, мое понимание говорит мне, что он должен работать anywawy,
Jason
1

голосов
2

ответ
412

Просмотры

Как получить доступ к закрытым членам абстрактного класса от своего друга класса?

класс А {частное: ИНТ а, б, в; общественности: виртуальный ИНТ прибудет () = 0; друг класса B; }; класс B {// здесь я хочу получить доступ к закрытым переменным класса А, который является, Ь, с}; Класс C: класс Публичного {INT прибудет () {// некоторого код}}; Как получить доступ к закрытым членам класса А в класс В. Я не могу создать объект класса А, так как он является абстрактным. Я как-то должны использовать объект класса C, чтобы сделать это, но как?
PuRaK
7

голосов
1

ответ
602

Просмотры

В чем разница друг итератор и другой класс итератора, которые сталкиваются мышления в C ++?

В Thinking в C ++, Том 1, глава 16: Введение в шаблоны. Контекст: Обратите внимание на то, что вместо того, чтобы просто сказать: друг итератора; // Сделать другом Этот код имеет: друг класс итератора; // Сделать другом Это важно, потому что имя «итератор» уже находится в области видимости, из включаемого файла. Что на самом деле означает Eckel выше? Кажется, друг итератор компилирует правильно, и я не могу увидеть различие. Может кто-нибудь сказать ответ? Спасибо
Alister
8

голосов
4

ответ
519

Просмотры

рекурсивные классы друг

Есть ли способ обойти это: класс B; класс C {общественности: C () {} частное: INT I; друг B :: B (); }; класс B {общественности: B () {} частное: INT I; Друг C :: C (); }; Дает об ошибке: prog.cpp: 8: ошибка: недопустимое использование неполного типа 'структура B' prog.cpp: 1: ошибка: опережающее объявление о 'STRUCT B'
BCS
3

голосов
5

ответ
232

Просмотры

Сохраняя часть общественного вложенного класса видимого только гнездовой класса

У меня есть вложенный класс в C ++, который должен быть публичным. Но мне нужны некоторые из его методов, видимых с внешним миром, а остальные видимые только гнездовой класса. То есть: класс множество {общественности: класс итератора {innerMethod (); общественности: outerMethod (); }} Я хочу, чтобы иметь возможность написать метод набора, который использует innerMethod (). Если бы я сделать его открытым, я могу получить доступ к нему из-за пределов, а также, что это то, что я определенно не хочу. Есть ли способ сделать это, не делая «друг класс набор» вещь? Заранее спасибо!
Mockingbird
1

голосов
2

ответ
63

Просмотры

Друг класс не хорошо со мной?

Я пытаюсь разобраться с другим классом впервые. Я написал код ниже: класс Kind {частное: друга Тип класса; ИНТ х; общественности: Вид () {х = 0; } Недействительного Setx (интермедиат Х) {х = Х; } Int GetX () {возвращение х; }}; Класс Тип: общественный Вид {общественности: друг класс Kind; Тип () {} Вид корня; root.x = 3; }; Компилятор говорит мне, что я не могу сделать root.x = 3 ;, Что проблема ??
Aan
4

голосов
2

ответ
1.5k

Просмотры

“Friend Classes” in javascript

У меня есть класс Factory, который создает объект Widget. Объект Factory должен обратный вызов «частный метод» объекта Widget в более позднее время, чтобы передать ему некоторые АЯКС информацию. До сих пор единственная реализация я придумал, чтобы создать публичный метод в виджете, который возвращает частный метод к фабрике, а затем удаляет себя, Фабрика затем возвращает новый виджет, сохраняя указатель на закрытый метод , Вот упрощенный пример: функция Factory () {вар widgetCallback = NULL; this.ajaxOperation = функция () {// некоторые Ajax звонки widgetCallback ( 'ajaxresults'); } This.getNewWidget = функция () {вар WID = новый виджет (); widgetCallback = wid.getCallback (); вернуться WID; } Функция виджет () {вар состояние = «нет состояния»; вар самостоятельно = это; вар modifyState = функция (NewState) {состояние = NewState; } This.getState = функция () {состояние возврата; } This.getCallback = функция () {удалить self.getCallback; вернуться modifyState; }}} Есть лучший способ для достижения эффекта я после или это довольно разумный подход? Я знаю, что это работает, просто интересно, если я заходя в любые ошибки, я должен знать. }}} Есть лучший способ для достижения эффекта я после или это довольно разумный подход? Я знаю, что это работает, просто интересно, если я заходя в любые ошибки, я должен знать. }}} Есть лучший способ для достижения эффекта я после или это довольно разумный подход? Я знаю, что это работает, просто интересно, если я заходя в любые ошибки, я должен знать.
Derg
2

голосов
1

ответ
689

Просмотры

друг класс с декларацией вперед класса не компилируется

Это основная программа, чтобы понять, как использовать класс друга в C ++. Класс ххх имеет объект класса YYY с помощью друга. Так как класс ууу определен после класса ххх Я объявил класс YYY с использованием прямого заявления. #include с помощью зОго :: COUT; используя зЬй :: Endl; класс ий; // Вперед Декларация класса его класс хого {частное: Int А; общественности: ххх () {а = 20; YYY у2; y2.show ();} // ошибка // аннулируются шоу () {соиЬ
Santosh Sahu
4

голосов
1

ответ
641

Просмотры

Два класса с методами друга в C ++

В настоящее время я читаю книгу о C ++ и имеет некоторые упражнения. Одно из упражнений просит, чтобы построить два класса, где каждый имеет метод друг за друга. Мой текущий догадка выглядит следующим образом: #include с помощью зОго :: COUT; используя зЬй :: Endl; класс Y; класс X {общественности: аннулируются друг Y :: F (X * х); недействительный г (У * у) {соиЬ
gkuzmin
7

голосов
3

ответ
279

Просмотры

Наследование дружбы в C ++?

Поскольку класс дружба не наследуется в C ++, что это лучший способ «подделка» это? Я думал о том, обнажая частный интерфейс друга класса через защищенные методы в к-быть унаследованным базовым класс, но это приводит к необходимости писать (и поддерживать) один и тот же интерфейс, дважды. Есть ли другие способы?
sold
7

голосов
2

ответ
2k

Просмотры

C ++ Templates: Частичный шаблон спецификация и классы Friend

можно ли как-то сделать частичную спецификацию шаблона друг классом? Т.е. рассмотреть у вас есть следующий шаблон класса шаблона класса X {T T; }; Теперь у вас есть частичные специализации, например, для класса указателей шаблонов X {T * T; }; То, что я хочу сделать то, что весь возможный X является другим классом X для ЛЮБОГО Sie X должен быть другим X. Конечно, я думал об обычном шаблоне друг декларации в X: шаблон класс X {шаблон друг класса X; } Однако это не компилируется, г ++ говорит мне это: test4.cpp: 34: 15: ошибка: специализация «шаблон класс X» должна появиться в области видимости пространства имен test4.cpp: 34: 21: ошибка: частичная специализация «X» заявил «друг» Разве это не возможно вообще или есть обходной путь? Причина, почему я спрашиваю, что мне нужна конструктор в X, который создает этот класс от произвольного X (S должен быть подтипом T). Код выглядит следующим образом: шаблон класса X {T * т; шаблон X (X х): т (& (х)) {} // Ошибка, х частная} Теперь компилятор жалуется, конечно, что х не в Запись видна конструктору, так как он является частным. Вот почему мне нужен частичный класс специализации друга.
gexicide