我正在为我的控制台应用程序使用一个引擎。这个引擎不能更改。这个引擎包含一个名为Mesh的类。在这个类findBoundaryLoops()
中有一个公共方法,我正在我的类中使用它(它不是引擎的一部分)但是我必须传递一个参数给这个方法,它的类型VertexLoop
被定义为私有属性。我不确定我解释的是否正确。这里有一个代码的表示
补片h:
class Mesh final
{
private:
...
struct VertexNode
{
Edge connectingEdgeWithNext;
Vertex vertex;
VertexNode* prev;
VertexNode* next;
float angle;
};
struct VertexLoop
{
VertexNode* firstNode;
uint32_t nodeCount;
template<typename Callable>
void forEachNode(Callable&& f)
{
VertexNode* n = firstNode;
for (uint32_t i = 0; i < nodeCount; ++i, n = n->next)
{
f(n);
}
}
};
...
public:
...
void findBoundaryLoops(memory::MemoryArena& arena, vector<VertexLoop>& loops) const;
...
};
我必须使用findBoundaryLoops()
方法,但是VertexLoop
结构体是私有的。是否有变通方法或其他方法可以解决这个问题?
1条答案
按热度按时间vaqhlq811#
这个答案有两个部分。下面我将向你展示如何访问在private节中声明的类型。但是我认为重要的一点,这就是为什么我把它放在第一位,你应该意识到你不需要下面的解决方案。任何人都可以访问
VertexLoop
。名字是私有的,类型不是。一开始在私有部分声明它是没有意义的。如果类型出现在公共方法的签名上,那么您也可以将其放在public节中。如果这是库代码或生成的代码,那么要么您误解了如何使用它,要么可以认为它已损坏。
更简单的例子:
现在我们写一个trait,给定一个
foo
的成员函数,它有一个vector
参数,告诉我们这个向量的value_type
,然后我们用一个指向foo::f
的指针示例化它,得到bar
的别名:使用它:
Live Demo
也许值得注意的是,这绝不能与访问类的私有成员(是的,它们确实存在)的“肮脏的黑客”相提并论。这不是黑客,它是一个非常好的trait的部分特化,以获得公共方法的参数类型。
TL;DR不要这样做。将
VertexLoop
移到public部分。