2013-05-29 4 views
0

Пожалуйста, смотрите первый код: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 «s членам, как будто BMstring не наследуют BMfont» s членов? Например, если я делаю это:

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

Можете ли вы привести пример исходного кода? Я не понял. И, пожалуйста, снова посмотрите на сообщение, я сделал редактирование. – mr5

+0

Хорошо, я понял. Причина, по которой я вывел 'BMstring' из' std :: string', заключается в том, что я хочу переопределить оператор присваивания 'std :: string' и поставить там функцию' Compile() '. И, сделав ссылку на 'BMfont', я не могу это сделать' text = "some string"; ' – mr5

+0

, тогда вам может понадобиться шрифт по умолчанию, который может использовать строка, это может быть статический член либо BMFont, либо BMString, доступ к которой может получить ваша функция BMString. – matt

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