Как получить доступ к приватному статическому методу из класса друга в c ++ - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь получить доступ к приватному статическому методу из класса друга, но получаю ошибку LINK.Доступ к любым другим приватным нестатическим элементам и методам работает просто отлично.

ПРИМЕЧАНИЕ : Этот вопрос не для общего неразрешенного символа (библиотека DLL содержит реализациюи связываемся со своей библиотекой).Символ существует в DLL, но он отображается как «приватный» (если я проверяю его в обходчике зависимостей), пока компоновщик ищет «публичный» (если я проверяю оформленное имя, сообщаемое компоновщиком).Проблема, как я вижу, заключается в том, что компоновщик, похоже, игнорирует дружбу при попытке разрешить частный статический метод.

например:

class CA
{
    friend class CMyFriend;
private:
    static void TestedFunc();
};

class CMyFriend
{
public:
    static void Tester()
    {
        CA::TestedFunc();
    }
};

1 Ответ

0 голосов
/ 25 апреля 2018

Это может быть суть, но вы можете немного изменить дизайн своих классов, чтобы использовать частный статический прокси-объект с открытым методом:

header

class CA
{
    friend class CMyFriend;
private:
    class CAProxy final {
    friend class CA;
    private:
        CAProxy(){}
    };
    static CAProxy proxy;
    static void TestedFunc();
public:
    static void TestedFunc(const CAProxy& proxy); // This just calls TestedFunc();
};

реализация

CA::CAProxy CA::proxy{};

void CA::TestedFunc(const CAProxy& proxy) {
    TestedFunc();
}

void CA::TestedFunc() {
    // your code...
}

caller

class CMyFriend
{
public:
    static void Tester()
    {
        CA::TestedFunc(CA::proxy);  // This will call the public method
    }
};

Поскольку общедоступному методу требуется ссылка на объект, экземпляр которого никто не может создать, кромеCA, и поскольку статический экземпляр CA::proxy является частным и доступен только для друзей, только друзья могут вызывать этот открытый метод.

...