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

Как заставить работать фрагмент кода ниже?

#include <iostream>

class MyClass {
public:
    namespace { // Anonymous namespace declaration
        void internalFunction() {
            std::cout << "Internal function called" << std::endl;
        }
    };
public:
    MyClass() {
        // Access anonymous entities
        internalFunction();
    }

    void doSomething() {
        // Access anonymous entities
        internalFunction();
    }
};

int main() {
    MyClass obj;
    obj.doSomething();
    return 0;
}

Что я хочу сделать?

У меня есть несколько простых функций, которые будут полезны только для класса. Поэтому я думаю, что их не следует определять вне указанного класса. А поскольку это простые функции, я думаю, что пространство имен лучше, чем класс.

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

463035818_is_not_an_ai 16.04.2024 11:50

ты ищешь private ?

463035818_is_not_an_ai 16.04.2024 11:50

@ 463035818_is_not_an_ai У меня есть несколько простых функций, которые будут полезны только для класса. Я думаю, что это не должно определяться вне указанного класса. А поскольку это простые функции, я думаю, что пространство имен лучше, чем класс.

John 16.04.2024 11:56

Вопрос не имеет смысла, и, скорее всего, это потому, что вы неправильно поняли, что делают пространства имен (анонимные или нет).

Passer By 16.04.2024 12:22

единственный способ сделать так, чтобы он «не был определен вне указанного класса», — это определить его внутри класса. Вы можете использовать дружественную функцию, которая не объявлена ​​вне класса, хотя ADL сделает ее доступной извне класса. Я думаю, вы очень ищете private.

463035818_is_not_an_ai 16.04.2024 12:38

Примечание: ничто в этом коде не требует дополнительных вещей, которые делает std::endl. Используйте '\n', чтобы завершить строку, если у вас нет веской причины не делать этого.

Pete Becker 16.04.2024 15:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  1. частные статические функции, решение по умолчанию:
class MyClass {
private:
    //inaccessible to outsiders but still visible in the header
    static void internalFunction() {
        std::cout << "Internal function called" << std::endl;
    }
public:
    MyClass() {
        // use the implementation detail nobody outside has to know about
        internalFunction();
    }

    void doSomething() {
        // use the implementation detail nobody outside has to know about
        internalFunction();
    }
};
  1. Функция в анонимном пространстве имен в файле реализации. Полезно, если в сигнатуре функции есть какой-то тип, который вы не хотите раскрывать:
//in my_class.h
class MyClass {
private:
    //dear clients, nothing to see here    
public:
    MyClass();

    void doSomething();
};
//in my_class.cpp
#include "my_class.h"

namespace {
void internalFunction() {
    std::cout << "Internal function called" << std::endl;
}
}//namespace <local> (useful to mark closing namespace bracket with a comment)

MyClass::MyClass() {
    // use the implementation detail nobody outside has to know about
    internalFunction();
}

void MyClass::doSomething() {
    // use the implementation detail nobody outside has to know about
    internalFunction();
}

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

к частным статическим функциям-членам невозможно получить доступ за пределами класса?

John 16.04.2024 14:26

@Джон Да. Доступ к любому имени, объявленному в разделе private, из любого места, кроме методов этого класса (или методов его вложенных классов ± некоторые крайние случаи), является ошибкой компиляции.

Abstraction 16.04.2024 15:50

Другие вопросы по теме