Прошел много итераций в моей голове/на бумаге, и я не уверен, что такое «лучший» или «самый правильный» способ сделать этот сценарий.Доступ к дочерним данным из базового класса в C++
Установка:
- У меня есть класс 'А', оказываемую мне. Я не могу изменить этот класс. Этот класс имеет несколько общедоступных методов.
- Я написал класс «B», который занимает много классов «A» и управляет им как один, используя те же имена методов, чтобы сделать A и B взаимозаменяемыми в коде.
- Теперь я хочу написать класс 'C', который может взять класс 'A' или класс 'B' (или другой класс в будущем с теми же общедоступными методами) для выполнения более сложных операций.
Я попытался сделать это, написав «суперкласс» «D», чтобы иметь общие операции, в то время как «C» может наследовать «D» и предоставить требуемый тип. Однако 'D' не видит закрытую переменную 'C'.
Я уверен, что я просто думаю об этой структуре неправильно и так загрязняет, как правильно использовать наследование. Дайте классу D теперь знать тип класса C, я не могу заставить его применить его. D также будет иметь множество функций, которые требуют использования «o», и я пытался избежать повторной реализации каждого из них для каждого потенциального типа класса.
Я также уверен, что это общая проблема, но я искал ответ в течение 2 дней теперь ...
Упрощенный пример кода:
// Class A has been provided to me, and cannot be modified.
#include <classA.h>
class B {
public:
B(A *x, int num): z(x), n(num) {};
int num(void) {return n;};
// Other methods to operate on objects of class A as if they were a single
// one, using same method names. Maybe somehow inheritance is better here?
private:
A *z;
int n;
};
class D {
public:
D(void): s(5) {};
// 'o' to be provided by child class, must have method 'num'
void doThat(void) {return s+o.num();};
private:
int s;
};
// So we can handle multiple types of devices that have the same public methods
// This is just a class to get the private object that superclass D will need
class C: public D {
public:
C(B *h): o(h) {};
private:
B *o;
};
A ar[2] = { A(1), A(2) };
B l(ar, 2);
C j(&l);
Это заставляет меня в ошибка, которая 'o' не входит в объем.
Arduino: 1.8.1 (Windows 10), Board: "Arduino/Genuino Uno"
sketch_feb11b.ino: In member function 'void D::doThat()':
sketch_feb11b:26: error: 'o' was not declared in this scope
void doThat(void) {return s+o.num();};
exit status 1
'o' was not declared in this scope
Я вновь вернуться к C++, после многих многих лет, так что я тоже так же, как готов принять я не подходя к проблеме правильно, в первую очередь в настоящее время.
Вы оставили слишком много деталей. Пожалуйста, сделайте [mcve]. – nwp
Вы найдете [все ответы на свой вопрос здесь] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –