如何制作容器元素只能调用容器一个私有函数的结构
How to make structure where container's element can call containers only one private function
我想创建结构,其中 容器元素 可以向 容器 提供 回调,但是我不想让它成为 public
。我应该怎么做?我不能保证,也许我需要静态地给容器的 私有函数 地址给元素或以某种方式使用 friend
?顺便说一句 element 应该 "see" 其他容器的私有函数。
例如class Cont
存储 class Elem
。 Cont
有 私有函数 void callback();
。 Elem
知道自己在哪个Cont
,可以调用回调函数。 Cont
之外的任何人都不能使用 回调函数 。
在 Elem
构造函数中,您可以为回调提供一个参数(使用例如 std::function
或类似的方法),并让 Elem
class 存储它。然后当回调需要调用的时候,直接调用即可。
您还可以在 Elem
中创建一个 "setter" 函数来设置回调。
完整示例
#include <iostream>
#include <string>
#include <functional>
#include <vector>
class Elem
{
private:
int value_;
std::function<void(const std::string&)> callback_;
public:
Elem(int v, std::function<void(const std::string&)> cb)
: value_{v}, callback_{cb}
{}
void some_function() const
{
callback_("Elem with value " + std::to_string(value_));
}
};
class Cont
{
private:
std::vector<Elem> elements_;
void private_function(const std::string& s)
{
std::cout << "In private function: " << s << '\n';
}
public:
void add_value(const int v)
{
elements_.push_back(Elem(v, std::bind(&Cont::private_function, this, std::placeholders::_1)));
}
std::vector<Elem>::const_iterator begin() const
{
return std::begin(elements_);
}
std::vector<Elem>::const_iterator end() const
{
return std::end(elements_);
}
};
int main()
{
Cont c;
// Add some elements
for (int i = 1; i <= 10; ++i)
c.add_value(i);
// Call callback function
for (const auto& e : c)
e.some_function();
}
输出:
In private function: Elem with value 1
In private function: Elem with value 2
In private function: Elem with value 3
In private function: Elem with value 4
In private function: Elem with value 5
In private function: Elem with value 6
In private function: Elem with value 7
In private function: Elem with value 8
In private function: Elem with value 9
In private function: Elem with value 10
在上面的代码中,私有函数Cont::private_function
对Elem
class是完全未知的,不能直接调用。但是,我们可以使用参数将它传递给 Elem
class,然后从 Elem
class 内部调用它而根本不公开私有函数。
我想创建结构,其中 容器元素 可以向 容器 提供 回调,但是我不想让它成为 public
。我应该怎么做?我不能保证,也许我需要静态地给容器的 私有函数 地址给元素或以某种方式使用 friend
?顺便说一句 element 应该 "see" 其他容器的私有函数。
例如class Cont
存储 class Elem
。 Cont
有 私有函数 void callback();
。 Elem
知道自己在哪个Cont
,可以调用回调函数。 Cont
之外的任何人都不能使用 回调函数 。
在 Elem
构造函数中,您可以为回调提供一个参数(使用例如 std::function
或类似的方法),并让 Elem
class 存储它。然后当回调需要调用的时候,直接调用即可。
您还可以在 Elem
中创建一个 "setter" 函数来设置回调。
完整示例
#include <iostream>
#include <string>
#include <functional>
#include <vector>
class Elem
{
private:
int value_;
std::function<void(const std::string&)> callback_;
public:
Elem(int v, std::function<void(const std::string&)> cb)
: value_{v}, callback_{cb}
{}
void some_function() const
{
callback_("Elem with value " + std::to_string(value_));
}
};
class Cont
{
private:
std::vector<Elem> elements_;
void private_function(const std::string& s)
{
std::cout << "In private function: " << s << '\n';
}
public:
void add_value(const int v)
{
elements_.push_back(Elem(v, std::bind(&Cont::private_function, this, std::placeholders::_1)));
}
std::vector<Elem>::const_iterator begin() const
{
return std::begin(elements_);
}
std::vector<Elem>::const_iterator end() const
{
return std::end(elements_);
}
};
int main()
{
Cont c;
// Add some elements
for (int i = 1; i <= 10; ++i)
c.add_value(i);
// Call callback function
for (const auto& e : c)
e.some_function();
}
输出:
In private function: Elem with value 1 In private function: Elem with value 2 In private function: Elem with value 3 In private function: Elem with value 4 In private function: Elem with value 5 In private function: Elem with value 6 In private function: Elem with value 7 In private function: Elem with value 8 In private function: Elem with value 9 In private function: Elem with value 10
在上面的代码中,私有函数Cont::private_function
对Elem
class是完全未知的,不能直接调用。但是,我们可以使用参数将它传递给 Elem
class,然后从 Elem
class 内部调用它而根本不公开私有函数。