2013-03-02 4 views
0

я создал несколько класс, как показано ниже (Так как я не могу положить мой реальный класс Здесь я написал мало, как только пример)обращающиеся все частные члены класса C++

class One { 
     private : 
     char *link; 
     int count 

     } 


class Two { 
     private : 
     char *link; 
     int count 

     } 

class Three :: public TWO { 
     private : 
     char *link; 
     int count ; 
      One One_object; 

     } 

int main() { 

    Three test; 
    cout << test.One_object.link ; // error becoz of accessing private member 

     } 

Вот что было бы лучше чтобы получить доступ к частным меберам, если это только значение, то я мог бы написать функцию метода get для получения данных.

Но в моем реальном классе есть много данных пользователи защищены .. Может ли вы кого-то через свет на это ..

+1

Вы когда-нибудь слышали о функциях и классах «друга» и/или членах доступа (например, «getters» и «seters»)? – WhozCraig

+0

Как уже говорилось в WhozCraig, функция 'friend' (должна быть объявлена ​​в классе) может получить доступ к любому закрытому или защищенному члену класса, даже если она не является его членом. –

+0

Если вы действительно * имеете *, вы можете злоупотреблять тем фактом, что аргументы для явных шаблонных экземпляров игнорируют контроль доступа ('[temp.explicit]/12') для доступа к закрытым или защищенным членам. (Например, см. [This] (http://bloglitb.blogspot.com.au/2011/12/access-to-private-members-safer.html)).Тем не менее, 'private' и' protected' предназначены для сокращения объема переменных, чтобы сделать код более понятным. Если вам нужны переменные, которые доступны из любого места, вы должны просто сделать их «public». – Mankarse

ответ

1

private В и protected переменных членах призваны быть доступно с помощью функций-членов аки methods.

methods, предназначенные для использования только изнутри method того же класса, но не извне, должны быть закрыты или защищены.

Выбор private vs protected зависит от того, наследуется ли вы от этого класса или нет. Рекомендуется использовать защищенные для всех членов, чтобы любой класс, который наследует (может быть в будущем) от этого класса, также выигрывает, получая доступ к этим членам.

И есть функции friend, которые позволяют вам получить доступ к private или protected членам вне непосредственно.

+0

* Выбор private vs protected зависит от того, наследуется ли вы от этого класса или нет. Рекомендуется использовать защищенные для всех участников, чтобы любой класс, который наследует (может быть в будущем) от этого класса, также получает выгоду, получая доступ к этим членам. * - не согласен. конечно, это связано с предпочтениями и тем, как вы структурируете свои программы - проекты с наследованием-тяжелым дизайном, как правило, имеют меньшую гибкость в этом отношении. Я думаю, что защищенная - это нечетная утка, что частный - хороший дефолт, и доступ должен предоставляться только в случае необходимости. я использую защищенные гораздо меньше, чем частные и общедоступные. – justin

0

В main, когда вы делаете test.One_object (необходимо отметить One_object как public, хотя), вы получаете экземпляр One объекта непосредственно, но даже тогда вы не можете получить доступ к закрытым членам One, потому что они не видны из этого контекст. Таким образом, у вас есть два варианта:

1) Если класс One редактируется, необходимо отметить переменные, которые вы должны получить доступ от основной, как public

ИЛИ

2) Сделать Threefriend class из One и напишите функцию getter для каждой переменной-члена One_object в Three.

Таким образом, следующий вариантом 2-

class One { 
     private : 
     char *link; 
     int count; 

     friend class Three; 
}; 
class Three : public Two { 
     private : 
     char *link; 
     int count ; 
     public: 
     One One_object; 
     int get_One_object_count(){ 
      return One_object.count; 
     } 

}; 

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

Подробнее о friend class и .