Задача программирования на С ++ 2 - PullRequest
0 голосов
/ 18 мая 2011

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

#include<iostream>
using namespace std;
class complex
{
 float x,y;
};
int main ()
{
  complex a; 
  a.x=500;
   a.y=600;
cout<<" the value of a.x = "<<a.x<<"\n" ;
cout<<" the value of a.y = "<<a.y<<"\n" ;

return 0;
}

, когда я компилирую программу, она выдает мне следующую ошибку:

try.cpp: In function ‘int main()’:
try.cpp:5: error: ‘float complex::x’ is private
try.cpp:10: error: within this context
try.cpp:5: error: ‘float complex::y’ is private
try.cpp:11: error: within this context
try.cpp:5: error: ‘float complex::x’ is private
try.cpp:12: error: within this context
try.cpp:5: error: ‘float complex::y’ is private
try.cpp:13: error: within this context 

Я исправляю ошибку, просто объявив элемент данных public;

Теперь, что я должен сделать, чтобы эта штука работала с приватным участником?Почему я не могу получить доступ к приватному члену с помощью объекта класса?Как я могу напрямую получить доступ к частным членам данных или почему я не могу использовать член данных класса напрямую с объектом класса?В чем причина этого?

Как класс реализован в памяти?Как класс мешает нам или мешает нам использовать его личные данные или реализует его механизм безопасности?что делает компилятор, когда видит класс?Как компилятор реализует класс и его механизм безопасности?

Пожалуйста, объясните мне это

Ответы [ 6 ]

3 голосов
/ 18 мая 2011

Теперь, что я должен сделать, чтобы эта штука работала с приватным участником?

Если вы сделаете их private, то вы можете написать конструктор и добавить другие полезные функции в ваш класс для выполнения операций над вашими сложными объектами:

class complex
{
   float _x;
   float _y;
   public:
      complex(float x=0.0, float y=0.0) : _x(x), _y(y) {}
                                       //^^^^^^^^^^^^^its initialization list!

      complex operator + (const complex & c)
      {
          return complex(_x + c._x, _y + c._y);
      }
      ostream & print(ostream & out) const
      {
          return out << "(" << _x << ", "<< _y << ")";
      }
      void print() const
      {
          print(cout);
          cout << endl;
      }

      //and so on
};

ostream & operator << (ostream & out, const complex &c)
{
    return c.print(out);
}

Проверьте это:

int main ()
{
  complex a(500,600);
  complex b(80,60);
  complex c = a + b; //operator+() gets invoked!

  a.print();
  b.print();
  c.print();

  cout << "\nprint using cout!" << endl;
  cout << a << endl;
  cout << b << endl;
  cout << c << endl;
  return 0;
}

Выход:

(500,600)
(80,60)
(580,660)

print using cout!
(500,600)
(80,60)
(580,660)

См. Онлайн-демонстрацию: http://www.ideone.com/TiGat

0 голосов
/ 18 мая 2011

Чтобы получить доступ к закрытому члену класса, вы можете:

  1. Предоставление открытых методов для чтения и записи значения закрытых членов.Таким образом, класс может получить полный контроль над операциями доступа.
  2. Предоставление открытых методов для возврата указателей или ссылок закрытых членов.Это не очень хороший способ, так как состояние объекта может быть разрушено.
  3. Дефектные классы или функции как друзья класса, который содержит приватный член, так что друзья могут получить доступ ко всем членам.Убедитесь, что друзья корректно работают с элементом данных класса.

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

Давайте рассмотрим пример, см. Простой класс стека ниже:

class statck
{
private:
    static const int buffersize = 100;
    int buffer[buffersize];
    int count;
public:
    stack();
    bool Push(int value);
    bool Pop(int value);
    int GetCount();
}

Счетчик логически представляет, сколько значений было помещено в стек, его значение управляется Push, Pop и конструктором, и не должно изменяться кодом с использованием объекта класса стека, например:

statck s;
s.count = 10;

Потенциал кода не имеет смысла.Если счетчик общедоступен, код может быть скомпилирован, и ошибку было сложнее выявить, и, объявив счетчик как частный, ошибка становится очевидной и вызывает ошибку компиляции.

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

Модификаторы доступа не влияют на компоновку памяти, создаваемую компилятором для представления объекта.Строго говоря, компоновка зависит от размера слова компилятора и платформы, но, как правило, в 32-битной системе объект statck будет состоять из 404-байтового блока памяти, 400-байтового для буфера и 4-байтового для подсчета, независимо от того, открыт ли буфер и счетчик или нет.или частный.И когда программа работает, каждый код, который получает адрес 404-байтового блока памяти, может читать и записывать их, приватный не имеет к этому никакого отношения.

0 голосов
/ 18 мая 2011

Защита данных и абстракция являются фундаментальными концепциями объектно-ориентированного программирования. В дополнение к ответу Марка, я бы посоветовал вам прочитать любую из ваших любимых книг по программированию на C ++, таких как C ++ Эрика Наглера, практический подход или учебник по C ++ и т. Д.

0 голосов
/ 18 мая 2011

public, private и protected - понятия времени компиляции.Во время выполнения они даже не существуют.Это прояснилось, давайте перейдем к тому, почему вы не можете получить доступ к private данным.

private - это то, что он говорит - ЧАСТНЫЕ.И это все, нет доступа никуда, кроме самого класса.A class по умолчанию является приватным, пока не указано иное.
Если вы хотите public по умолчанию, возьмите struct.За исключением «конфиденциальности» по умолчанию, они точно такие же.

struct complex{
  float x;
  float y;
};

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

0 голосов
/ 18 мая 2011

По умолчанию поля, которые вы определяете внутри класса, являются «частными» и могут использоваться только методами этого класса.

Вам необходимо определить x и y как «публичные» члены класса.

class complex
{
 public:
 float x,y;
};
0 голосов
/ 18 мая 2011

Ваши a.x и a.y пытаются получить доступ к x и y членам вне класса. Если они не являются публичными, эти попытки потерпят неудачу, как вы видели.

Если вы хотите, чтобы доступ по умолчанию был общедоступным, а не частным, используйте struct вместо class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...