LINUX.ORG.RU

Получить доступ к элементу

 ,


0

1

Подскажите как получить доступ к элементам класса B и C в цикле по вектору D?

class A {
  int i;
  void fun();
}

class B::A {
   i = 1;
   fun() {...};
   ...
}

class C::A {
   i = 2;
   fun() {...};
   ...
}

vector<A*> D;

D.push_back(&B);
D.push_back(&C);

for (...)
   ...

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

★★★★★

Последнее исправление: Zodd (всего исправлений: 3)

c++ iterators

anonymous
()

Используй классы.
vec.push_back(new A());

anonymous
()

вынести «елементы» в базовый класс и начать использовать полиморфизм.

x0r ★★★★★
()

dynamic_cast или объяви fun в A и сделай виртуальной функцией. Если я правильно понял, что тебе нужно

Gvidon ★★★★
()
Ответ на: комментарий от x0r

вынести «елементы» в базовый класс и начать использовать полиморфизм.

Да, я забыл в базовом добавить, подправил. Как раз хочу использовать полиморфизм. Проблема в реализации.

Вот тут что подправить?

for (vector<A*>::iterator it = D.begin(); it != D.end(); ++it)
  ...
Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zodd

Хорошо, даже при условии, что ты всё сделаешь корректно, и оно заработает, нафига ты второй раз изобретаешь RTTI? И абсолютно ли ты уверен, что оно тебе нужно?

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

Да. Вот у меня есть классы стержня, пластины и трехмерного тела. У каждого свои размеры, узлы, процедуры. Из таких элементов состоит конструкция. Поэтому мне нужно пробежаться по всем элементам и вызвать у них конкретные процедуры.

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zodd

Виртуальные функции спасут отца русской демократии. Если ну уж очень хочется поизвращаться, то повторюсь, RTTI в C++ уже существует, не нужно изобретать кривой велосипед

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)
Ответ на: комментарий от x0r

Сейчас работает, х.з. почему дома не работало.

Всем спасибо.

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Gvidon

У меня fun и так виртуальная, я просто тут ее не раскрыл полностью. Вот нашел код:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct A {
    double p1, p2;
    virtual void fun() = 0;
};
 
struct B: A {
    void fun() {cout << p1+p2 << endl;}
};
 
struct C: A {
    void fun() {cout << p1-p2 << endl;}
};
 
void proc(vector<A*>& a) {
    for_each(a.begin(),a.end(),mem_fun(&A::fun));
}

int main()
{
    B b;
    C c;
    b.p1 = 2.3;
    b.p2 = 1.7;
    c.p1 = 2.9;
    c.p2 = -1.5;

    vector<A*> a;
	a.push_back(&b);
	a.push_back(&c);
 
    proc(a);

	for (vector<A*>::iterator it = a.begin(); it != a.end(); ++it)
		cout << (*it)->p1 << endl;

	return 0;
}
Zodd ★★★★★
() автор топика

Подскажите как получить доступ к элементам класса B и C в цикле по вектору D?

понедельник день тяжелый. сначала решил, что B, C и D - названия языков программирования

MyTrooName ★★★★★
()
Ответ на: комментарий от Zodd

пятница была день тяжелый :) профессия - учитель. до сих пор не отошел

MyTrooName ★★★★★
()
Ответ на: комментарий от Uter

Красиво. Надо переходить.

Zodd ★★★★★
() автор топика

получить доступ к элементам класса B и C

Получить доступ к самим элементам(а необщему интерфейсу, как описано выше) можно с помощью двойной диспетчеризации. То есть схематично:

class VectorProcessor() {
  void process(B& d) {
    //тут что-то делаем с B
  }

  void process(C& c) {
    //тут что-то делаем с C
  }
};

class A {
  virtual void dispatch() = 0;
}

class B : public A {
  void dispatch(VectorProcessor& vp) {
    vp.process(*this);
  } 

  ..далее код класса

};

class C : public A {
  void dispatch(VectorProcessor& vp) {
    vp.process(*this);
  } 

  .. далее код класса
};


int main() {
  ...

  VectorProcessor vp;
  for(vector<A *>::iterator it = D.begin(); it != D.end(); ++it) {
    it->dispatch(vp);
  }


}

urquan
()
Ответ на: комментарий от x0r

А почему не weak_ptr? Пока в вектор помещаются указатели на auto переменные нет смысла городить огород.

anonymous
()
Ответ на: получить доступ к элементам класса B и C от urquan

Зачем здесь двойная диспетчерезация. Её следует использовать, когда возникает реализация функции зависит от фактического типа двух параметров, переданных через указатель на базовый класс.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.