2013-03-07 2 views
0

У меня вопрос двух частей. Во-первых, я понимаю, что C++ обеспечивает только инкапсуляцию данных на уровне класса, что означает, что все объекты одного класса имеют доступ к частным членам друг друга. Я понимаю причину этого, но нашел несколько ссылок (т.е. http://www.programmerinterview.com/index.php/c-cplusplus/whats-the-difference-between-a-class-variable-and-an-instance-variable/), которые, по всей видимости противоречат этой точке, предполагая, что я мог бы сделать следующее:Инкапсуляция уровня экземпляра с C++

class testclass { 
    private: 

    // Below would be an instance-level variable, and new memory for it is set aside 
    // in each object I create of class testclass 
    int x; 

    // Below would be a class-level variable, memory is set aside only once no matter 
    // how many objects of the same class 
    static int y; 
} 

То, что я хотел бы сделать, это на самом деле сделать эту работу, т.е. я хотел бы определить переменную в классе, который является приватным в каждом экземпляре (это мой второй вопрос). Поскольку вышеприведенный фрагмент кода не достигает этого, есть ли работа, которую я могу использовать для создания данных, которые являются частными для отдельных объектов? Спасибо!

EDIT:

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

class car { 
    private: 
    int mileage; 
    public: 
    car(int); // Constructor 
    void odometer(); 
}; 

car::car(int m) { 
    mileage = m; 
} 

void car::odometer() { 
    return mileage; 
} 

int main(void) { 
    car ford(10000), honda(20000); 

    cout<<ford.odometer(); //Returns 20000, since honda constructor overwrites private variable 'mileage' 
} 

Есть ли способ, чтобы получить одометр() метод, чтобы вернуть пробег либо брод или Хонды, в зависимости от того, что я хочу?

+1

Каков первый вопрос? И почему вы хотите защитить экземпляры от доступа к переменным-членам друг друга? –

+0

'// Возвращает 20000, поскольку конструктор honda перезаписывает личную переменную« пробег ». Это совершенно неправильно. Вы это подтвердили? Он перезаписывает свой * собственный * член, конечно, но зачем он касаться чего-нибудь еще? – GManNickG

ответ

1

Priviledge (public, private, protected) применяется только к именам. Только в то время, когда имя будет разрешено, компилятор будет применять разрешения. После компиляции вся такая информация исчезла.

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

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

Я не уверен, что вы просите со ссылкой на «в каждом экземпляре». AFAIK, нет собственного способа сделать переменную private такой, что только этот экземпляр может получить к ней доступ. Во всех случаях экземпляры могут обращаться к частным частям друг друга.

Есть несколько способов, которыми вы могли бы обойти это, я полагаю. Во-первых, это templatize ваш класс и дать каждому экземпляру другого типа. Вы можете сделать это с помощью целочисленного параметра шаблона или чего-то еще. Это может сделать жизнь раздражающей, хотя вы пытаетесь работать с этими типами как одно и то же. Вам придется виртуализовать и иметь абстрактный базовый класс или что-то в этом роде.

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

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

+0

Спасибо @crazyeddie. См. Правки для публикации выше. – Taylor

+0

@ user1207789 - за ваше редактирование ... Я не получаю результат, который вы говорите. После создания источника компилируемого: http://stacked-crooked.com/view?id=46205e48402d8726f99e1c9c5946ab0c-18aa934a8d82d638dde2147aa94cac94 –

+0

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

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