2013-07-12 3 views
0

У меня есть класс, который выглядит следующим образом (детали удалены):Как ссылаться на другие элементы в классе внутри внутренней структуры

class MyClass{ 
     int seq[8]; 
     ... 
    public: 
     ... 
     static struct{ 
      bool sorted(); 
      bool reverse_sorted(); 
      ... 
     }test; 
}; 

То, что я пытаюсь сделать, это отдельное некоторые из моих MyClass функций-членов в симпатичные маленькие группы (структуры). Проблема в том, что функции в «тестовой» структуре нуждаются в доступе к членам MyClass.

Когда я использую код выше, я могу определить bool sorted(){..}, но он не делает его частью пространства имен MyClass, как я надеялся.

Мое намерение состоит в том, чтобы иметь возможность написать что-то вроде этого:

MyClass M; 

*do stuff with M* 

if(M.test.sorted()){ 
    *do something* 
} 
else if(M.test.reverse_sorted()){ 
    *do something else* 
} 

Есть ли способ, что-нибудь подобное можно? (Как) я могу позволить внутренней структуре иметь доступ к членам данных класса? & & Смогу ли я получить доступ к функциям с помощью синтаксиса «MyObject.test.function()»?

+0

Как насчет множественного наследования? – Antonio

+1

Когда функция должна использовать определенный объект, вы должны передать его этой функции ... – PlasmaHH

ответ

0

Вы можете объявить свою структуру как friend вашего класса, чтобы достичь того, чего хотите, но вам нужно будет предоставить ссылку на свой класс. Я бы, честно говоря, считаю, что плохой стиль, но это работает:

class M 
{ 
    public: 
     struct x 
     { bool sorted(M & m) const { return m.sorted; } } test; 

    private: 
     bool sorted; 
     friend class x; 
}; 
+0

«Статический», возможно, был просто ошибкой в ​​моей логике. Я думал, что структура является объектом, и мне нужен только один экземпляр для работы с объектами MyClass. Я вижу, как я ошибаюсь. Я думаю, что это просто поможет разобраться в моих функциях членов - мне около 40. Возможно, мне придётся прибегнуть к их префиксам, как предложил Кирилл. –

+0

Да, это звучит хорошо - вы все равно хотите избежать деклараций 'friend', потому что они делают это, чтобы сломать правильную инкапсуляцию, и в этом случае он кричит грязное обходное решение – user2573221

0

Я бы рекомендовал использовать простую вещь:

class MyClass 
{ 
     int seq[8]; 
     ... 
    public: 
     ... 

     bool group1_sorted(); 
     bool group1_reverse_sorted(); 

     int group2_something_else(); 
}; 

Приставка даст вам достаточно выделить в то время как все проблемы волшебным образом исчезает ... Зачем вам эти структуры вообще?

+0

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

Смежные вопросы