2017-02-11 16 views
1

Прошел много итераций в моей голове/на бумаге, и я не уверен, что такое «лучший» или «самый правильный» способ сделать этот сценарий.Доступ к дочерним данным из базового класса в 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++, после многих многих лет, так что я тоже так же, как готов принять я не подходя к проблеме правильно, в первую очередь в настоящее время.

+0

Вы оставили слишком много деталей. Пожалуйста, сделайте [mcve]. – nwp

+0

Вы найдете [все ответы на свой вопрос здесь] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –

ответ

4

Вы можете использовать шаблоны для D

template<typename T> 
class D: 
{ 
    D(const T* t): m_t(t) {}; 
    int doThat(void) { return m_t->num(); }; 

private: 
    T* m_t; 
} 

A ar[2] = { A(1), A(2) }; 
B l(ar, 2); 
C<B> j(&l); 
+1

Шаблоны были недостающим звеном в этом случае. Задолго до того, как я работал на C++, я забыл о них все. Прекрасный пример того, как выглядит проблема, с которой вы сталкиваетесь, на самом деле не проблема, с которой вы сталкиваетесь. Благодаря! –

0
class D { 
public: 
    D(): s(5) {} 
    // Your child class must overload getter method getNum() 
    int doThat() { 
    return s + getNum(); 
    } 
private: 
    int s; 
    // pure virtual, must be overload 
    virtual int getNum() = 0; 
... 
}; 

class C : public D { 
private: 
    B* o; 
    // overload pure func 
    int getNum() override { 
    return o->num(); 
    } 
public: 
    // Use default D ctor 
    C(B* b) : D(), o(b) {} 
... 
}; 

A ar[2] = { A(1), A(2) }; 
B l(ar, 2); 
C j(&l); 
j.doThat(); // return 5 + ar->num 

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

  • Нет связанных вопросов^_^