如何从其成员类/ struct中获取类的成员数据?

时间:2011-07-15 22:37:59

标签: c++ class polymorphism membership functor

嘿,我有一个名为 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

2 个答案:

答案 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;
};