-3

Есть класс:

class A
{
    private:
       int i;
};

Нужно вне класса присвоить i некоторое значение с помощью прокси-класса. Как это можно реализовать?

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
MisHa
  • 13
  • 2
    Кроме вас никто не знает, что в данном случае означает прокси-класс. Поэтому вам, как говорится, все карты в руки! Дерзайте!:) – Vlad from Moscow Nov 09 '15 at 09:09
  • https://ru.wikipedia.org/wiki/Proxy_(шаблон_проектирования)#C.2B.2B – MisHa Nov 09 '15 at 09:10
  • надо короч передать управление прокси класу и он присвоит типо нам так сказали – MisHa Nov 09 '15 at 09:12
  • Я лишь могу предположить, что имеется в виду что-то вроде такого class A { private: int i; }; struct B { int i; };
    A a;
    
    reinterpret_cast<B &>( a ).i = 10;
    
    – Vlad from Moscow Nov 09 '15 at 10:07

2 Answers2

2

Ну, может и не в тему прокси, но как вариант "наследование": =)

class A
{ 
private: 
    int i;
protected:
    void set_val(int x) 
    { i = x; }
public:
    int get_val(void) const
    { return (i); }
};

class B : public A
{
public:
   B()
   { A::set_val(0); }

   void set_value(int x)
   { set_val(x); }

   int get_value(void) const
   { return get_val(); }
};

void func(void)
{
    B b;
    int xx = 777, yy = 0;

    b.set_value(xx);
    yy = b.get_value();
}
1

Как-то так, примерно:

class ProxyA;

class A
{
  public:
    A() : i(0) {}
    int i() { return i; }

  private:
    int i;

  friend class ProxyA;
};

class ProxyA
{
  public:
  static void set(A* a, int i)
  {
    a->i = i;
  }
};

// использование:
A obj;
std::cout << "before: " << obj.i() << std::endl; // вывод: 0
// obj.i = 1; - если раскомментировать, здесь будет ошибка при компиляции
ProxyA::set(&obj, 1);
std::cout << "after: " << obj.i() << std::endl; // вывод: 1
aleks.andr
  • 2,489
  • А вообще, вы бы по-точнее написали, что вам необходимо получить. – aleks.andr Nov 09 '15 at 09:25
  • Лучше конечно такие задачки самому решать. Основы основ. Почитайте любую книгу по С++. – aleks.andr Nov 09 '15 at 09:29
  • 2
    @MisHa Ответ не соответствует вашему вопросу. У вас в вопросе задан конкретный класс с отсутствием доступа к своему члену данных. Поэтому никакой прокси здесь не поможет.:). – Vlad from Moscow Nov 09 '15 at 09:49
  • @MisHa "настоящему програмисту кинги не нужны" - А чем тогда настоящие программисты заняты в туалете? Или они с ноутбуком ходят в туалет? – Vlad from Moscow Nov 09 '15 at 09:52
  • 2
    @MisHa, и все же класс A в ответе отличается от класса A в вопросе (наличием строчки friend class ProxyA;, которая в корне меняет дело). – avp Nov 09 '15 at 12:00
  • 2
    Согласен с @avp, после friend class можно ничего не читать. А вот по поводу доступа к приватным членам класса, такой вопрос уже был. – mega Nov 09 '15 at 18:21
  • @mega, согласен, введение friend class - грубый хак. Но в данном вопросе считаю, что не нужно подходить с таким формализмом. Совершенно очевидно, что вопрос - студенческая задача, где преподаватель просит, чтобы студенты проявили немного более знаний, чем он им дал, а не разрешали неразрешимое. Также совершенно очевидно, что студенты должны сами решать такие задачи и задавать вопросы "почему мой код не работает/работает не так?", а не просить готового решения. – aleks.andr Nov 10 '15 at 05:24
  • Да, @aleks.andr, возможно Вы правы. С точки зрения стандарта, мне Ваш вариант нравится больше, чем сам вопрос о доступе к приватным членам класса. Но и саму задачу можно трактовать двояко. Голосую за то, что вопрос "требует правки". – mega Nov 10 '15 at 19:05