Иерархия классов C ++

Пожалуйста, сначала посмотрите код:

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() иметь доступ к BMfont без какого-либо экземпляра BMfont внутри BMstring,


Или что если я сделаю это:

class BM_FONT_CALL BMstring : public std::string
{

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

public:

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

}

Делая Compile() член BMfont,
Но это не скомпилируется. Как мне этого добиться?

0

Решение

Самый простой и чистый способ — иметь ссылку в BMString и передавать ее в конструктор или метод компиляции. Без ссылки объекты BMfont и BMstring должны были бы быть связаны в памяти, причем каждый шрифт имел бы ровно одну строку — это, безусловно, нежелательно.

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();
}
0