C ++类层次结构

时间:2013-05-29 07:19:00

标签: c++ class class-hierarchy

请先查看代码:

class BM_FONT_CALL BMfont
{
public:

BMfont();
~BMfont();

bool Load(const std::string& fontName);
void Print(float x, float y);

class BM_FONT_CALL BMstring : public std::string
{

public:

    BMstring() { }
    BMstring(const char* str);

    BMstring& operator=(const char* str);
    BMstring operator+=(const char* str);

private:

    void Compile();

};

public:

BMstring text;
float scale;
_uint32 tabSize;
_uint32 textureSheet;
_uint32 backTexture;
_uint32 frontTexture;
bool enableMasking;

_uint32 base;
_uint32 lineHeight;
_uint32 pages;
_uint32 scaleW, scaleH;
_uint32 kerninfo_count;

BMkerninfo  *kerninfo;
BMchar      chars[MAX_CHAR];

private:

std::string _fontName;

};

我如何BMstring有权访问BMfont的成员,好像BMstring不会继承BMfont的成员?例如,如果我这样做:

BMfont::BMstring text;
text.scale //I don't want this

我想在这里做的是,我希望BMstring::Compile()能够访问BMfontBMfont内没有任何BMstring个实例。


或者如果我这样做:

class BM_FONT_CALL BMstring : public std::string
{

    std::function<void (void)> func;

public:

    BMstring() { func = BMfont::Compile(); }

}

成为Compile()的{​​{1}}成员。 但这不会编译。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

最简单,最干净的方法是在BMString中使用引用,并将其传递给构造函数或编译方法。如果没有引用,BMfont和BMstring对象必须在内存中耦合,每个字体只有一个字符串 - 这肯定是不可取的。

答案 1 :(得分:0)

据我所知你想做这样的事情:

class C{
public:
    C() : nested(*this)
        {
        }

    void callNested()
        {
            nested.callOuter();
        }

 private:
    class N{
    public:
        N(C &c) : outer(c)
            {
            }

        void callOuter()
            {
                outer.OuterFunc();
                // you have access to any C's member through outer 
                // reference
            }

    private:
        C &outer; 
    };

    N nested;

    void OuterFunc()
        {
        }
};

int main()
{
    C c;
    c.callNested();
}