Как обернуть пользовательские функции? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть три функции, которые будут использоваться в разных классах проекта. Функции используют (только читают) общие переменные, но управляют входными данными иначе, чем друг с другом.

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

  1. C - подход только к стилю заголовка. Это решение позволяет пользователю видеть var0 и var1. Чего я не хочу. (Подход с использованием пространства имен также не может скрыть переменные только для чтения AFAIK.)
#ifndef FUNC_H
#define FUNC_H
const int var0 = 30;
const int var1 = 75;

void func0(float input0)
{//manipulate input0//}

void func1(float input1)
{//manipulate input1//}

void func2(float input2)
{//manipulate input//}
#endif //FUNC_H
Классовый подход
#ifndef FUNC_H
#define FUNC_H

class Func
{
    public:
        static void func0(float input0);
        static void func1(float input1);
        static void func2(float input2);

    private:
        Func();
        static const int var0 = 30;
        static const int var1 = 75;
};

void Func::func0(float input0){}
void Func::func1(float input1){}
void Func::func2(float input2){}

#endif //FUNC_H

Это работает, но я не уверен, что это правильный способ достичь того, что я хочу. По сути, я хочу обернуть их аналогично библиотекам STL. Что посоветуете?

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Если вы хотите, чтобы ваши функции находились в файле заголовка (например, как встроенные или шаблонные функции), обычно используется пространство имен detail. Да, пользователи вашего заголовка могут получить к нему доступ, но обычно его просто игнорируют (поскольку это деталь реализации).

Итак,

#ifndef FUNC_H
#define FUNC_H

namespace detail {
    const int var0 = 30;
    const int var1 = 75;
}

void func0(float input0)
{
    // Use `detail::var0`
}

void func1(float input1)
{
    using namespace detail;
    // Or put a using declaration and
    // just use `var0`

}

void func2(float input2)
{
    // ...
}
#endif //FUNC_H
1 голос
/ 18 июня 2020

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

Итак, макет может быть:

// func_h.hpp
#ifndef FUNC_H
#define FUNC_H

// only declarations
void func0(float input0);
void func1(float input1);
void func2(float input2);

#endif //FUNC_H

и

// func_h.cpp

// common variables not part of the interface
const int var0 = 30;
const int var1 = 75;

// but definitions can use the common variables

void func0(float input0)
{//manipulate input0//}

void func1(float input1)
{//manipulate input1//}

void func2(float input2)
{//manipulate input//}
...