嘿,我有一个名为 Partition 的抽象类,它是一个仿函数,它是我的 ConcavePolygon 上课。 Partition Functor依赖于很多ConcavePolygon的数据,例如TPPLPoints和SFMLPoints。
我发现即使我已经在其中定义了类 取决于,我不能轻易达到Concaves的数据。 我该怎么办? 此吗
我还想使用 Body 类中的一些函数,并希望 通过ConcavePolygon做到这一点,因为它是它的后代。 (需要 AddShape()函数);
这是代码,如果它有用:
class ConcavePolygon : public Body{
protected:
std::list<Vector2f> SFMLPoints;
std::vector <TPPLPoint> TPPLPoints; //TODO: figure out how to make a temp version without Memory Exception
public:
//////////////////// Partitioning/Triangulating Classes /////////////////////////////////////////////////////////////
class Partition{
protected:
virtual void RunAlgorithm(){};
public:
Partition(Vector2f* Points, long numbPoints){ //TODO turn this into a base class for triangulate or Convexulate
//rev up all the needed data structs
std::list<TPPLPoly> PartitionOutput;
std::list <TPPLPoly> ::iterator I;
//Backup the points, and convert them to tppl
for(int I=0; I<numbPoints; I++){
TPPLPoints.push_back(TPPLPoint(Points[I].x, Points[I].y));
SFMLPoints.push_back(Points[I]);}
TPPLPoly Poly(&TPPLPoints[0], numbPoints, false);
//clear everything to be filled with the Partition Algorithm
this->Clear();
// Run the Partitioning Algorithm
RunAlgorithm();
// Convert results to SFML points, shapes, and add to the body
for( I= PartitionOutput.begin(); I!= PartitionOutput.end();I++){
sf::Shape TempShape;
for(int i=0; i< I->GetNumPoints(); i++)
TempShape.AddPoint( I->GetPoint(i).x, I->GetPoint(i).y);
this->AddShape(TempShape);
}
};
};
class Convexulate: public Partition{
bool RunAlgorithm(TPPLPoly& Poly, std::list<TPPLPoly>& PartitionOutput){
TPPLPartition Partition;
Partition.ConvexPartition_OPT(&Poly, &PartitionOutput);
};
};
class Triangulate: public Partition{
bool RunAlgorithm(TPPLPoly& Poly, std::list<TPPLPoly>& PartitionOutput){
TPPLPartition Partition;
Partition.Triangulate_OPT(&Poly, &PartitionOutput);
};
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////// Constructors /////////////////////////////////////////////////////
ConcavePolygon(Vector2f* Points, long numbPoints){
Convexulate(Points, numbPoints);
};
};// ConcavePolygon Class
答案 0 :(得分:4)
在C ++中,嵌套类实际上只是一种为类名确定命名空间(并提供保护:public / protected / private)的方法。除了名称之外,它们不会在两个类之间创建任何特殊关系:OuterClass :: NestedClass。
因此,您需要将嵌套类视为单独的类。如果希望NestedClass可以访问OuterClass的私有成员,则必须将其显式声明为OuterClass的朋友。如果希望NestedClass访问OuterClass的特定实例,则必须将它作为OuterClass的实例。
答案 1 :(得分:2)
实际上这个问题已经通过c ++缺陷报告解决了,任何当前(不太旧)的c ++编译器应该能够处理这个:
在11.7 [class.access.nest]第1段中,更改
嵌套类的成员对封闭类的成员没有特殊访问权限,也没有对已经为封闭类授予友谊的类或函数;应遵守通常的访问规则(第11条[class.access])。 到
嵌套类是成员,因此具有与任何其他成员相同的访问权限。
这是一个适合您的工作示例(使用VS2008编译好,但不会使用像VC6这样的旧编译器进行编译):
class Body{
public:
void foo()
{
}
};
class Outer: public Body {
public:
class Inner{
public:
Inner(Outer& out):m_rOut(out){}
void foo()
{
m_rOut.m_out = 1; //access private member of Outer class directly
m_rOut.foo(); //call member function of Body
}
private:
int m_inner;
Outer& m_rOut;
};
private:
int m_out;
};