Как заставить работать фрагмент кода ниже?
#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;
}
Что я хочу сделать?
У меня есть несколько простых функций, которые будут полезны только для класса. Поэтому я думаю, что их не следует определять вне указанного класса. А поскольку это простые функции, я думаю, что пространство имен лучше, чем класс.
ты ищешь private
?
@ 463035818_is_not_an_ai У меня есть несколько простых функций, которые будут полезны только для класса. Я думаю, что это не должно определяться вне указанного класса. А поскольку это простые функции, я думаю, что пространство имен лучше, чем класс.
Вопрос не имеет смысла, и, скорее всего, это потому, что вы неправильно поняли, что делают пространства имен (анонимные или нет).
единственный способ сделать так, чтобы он «не был определен вне указанного класса», — это определить его внутри класса. Вы можете использовать дружественную функцию, которая не объявлена вне класса, хотя ADL сделает ее доступной извне класса. Я думаю, вы очень ищете private
.
Примечание: ничто в этом коде не требует дополнительных вещей, которые делает std::endl
. Используйте '\n'
, чтобы завершить строку, если у вас нет веской причины не делать этого.
Если вам нужен фрагмент кода, который используется только классом, но не использует объект класса, есть два обычных решения.
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();
}
};
//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()
использует статические переменные.
к частным статическим функциям-членам невозможно получить доступ за пределами класса?
@Джон Да. Доступ к любому имени, объявленному в разделе private
, из любого места, кроме методов этого класса (или методов его вложенных классов ± некоторые крайние случаи), является ошибкой компиляции.
что заставило вас поверить, что можно ввести пространство имен внутри определения класса? или для чего это было бы полезно?