Nano Hash - криптовалюты, майнинг, программирование

Класс друга в пространстве имен не работает в Xcode Cpp (динамическая библиотека macos)

класс А.ч:

#pragma once
#include "classC.h"

using namespace Bname;

namespace Aname
{
    class  A
    {
        friend class B;
    private:
        void Aclassmethod();
    };

}

классB.h:

#pragma once
namespace Bname
{
    class B
    {
    public:
        void Bclassmethod();
    };
}

классC.h:

#pragma once
namespace Bname
{
    class C
    {
    };
}

классA.cpp:

#include "classA.h"

void Aname::A::Aclassmethod()
{
}

classB.cpp

#include "classB.h"
#include "classA.h"

void Bname::B::Bclassmethod()
{
    Aname::A *vv = new Aname::A();
    vv->Aclassmethod();            **ERROR**// Aclassmethod is a private member of Aname::A
}

Я пытаюсь скомпилировать код для macos как динамическую библиотеку. Код получает ошибку компилятора в Xcode cpp (доступ к частному члену класса), но правильно компилируется без ошибок в Visual Studio.

27.01.2021

  • Кстати, using namespace Bname; не надо. Вы втягиваете все пространство имен B в глобальное пространство имен. Скорее добавьте using B::B; в пространство имен A или даже просто friend class B::B:. 27.01.2021
  • Я не могу этого сделать, потому что я не включен classB.h в classA.h 27.01.2021
  • Это указывает на то, что вы делаете что-то не так: см. ответ ниже. И почему вы включаете classC.h в classA.h? Если вы не используете его напрямую, не включайте его. 27.01.2021

Ответы:


1

В classA.h, когда вы пишете friend class B;, компилятор не может знать, что вы имеете в виду Bname::B, а не какой-либо другой B. Предполагается, что неквалифицированный B, как здесь, принадлежит пространству имен вашей строки, поэтому значение вашей линии на самом деле friend class Aname::B.

Так что измените эту строку на friend class Bname::B, и вы (почти) хороши. Теперь вы получите ошибку компиляции, потому что Bname::B не видно из A. Это можно решить путем прямого объявления Bname::B в начале classA.h:

namespace Bname {
class B;
}

Итак, в заключение измените classA.h на:

#pragma once
#include "classC.h"   // This doesn't seem necessary

namespace Bname
{
   class B;
}

namespace Aname
{
    class  A
    {
        friend class Bname::B;
    private:
        void Aclassmethod();
    };

}
27.01.2021
  • ахаха, как раз в этот момент писал. Ты был быстрее. и дополнительный виртуальный +1 за замечание класса C (добро пожаловать в stackoverflow. отличный первый вклад) 27.01.2021
  • Работает, спасибо за быстрый ответ. 27.01.2021
  • Новые материалы

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

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..