Доступ к методу другого класса в C ++ - PullRequest
0 голосов
/ 11 января 2012

Вот объявление:

class a{
public:
    void print_fib(int x){
        printf("%d\n",b::getfib(x));
    };
};

class b{
public:
    void init();    //calculate the Fibonacci numbers, save them in `fib[]`
    int getfib(int x);
private:
    int fib[10];
};

class c{
private:
    a ca;
    b cb;
};

Как мне получить доступ к cb.getfib() из ca.print_fib()?

Ответы [ 4 ]

1 голос
/ 11 января 2012

Повторный заказ, иначе форвард объявить

class b{
public:
    bb();
};

class a{
public:
    aa(b& inst);
};

class c{
private:
    a ca;
    b cb;

public:
  void foo()
  {
    ca.aa(cb);
  }
};

// implement here
void a::aa(b& inst)
{
  // do stuff
  b.bb(); // voila
}

Лучшим конструктивным решением может быть выполнение b::bb() в c::foo() и передача результата в a::aa() .. тогда они могут быть независимыми ...

0 голосов
/ 11 января 2012

Основная проблема, которую я вижу в коде в том виде, в каком я его вижу сейчас, - это вызов b::getfib(x) из a::print_fib, который не является правильным способом сделать этот вызов.статический, и не может быть, если «кеш» также не сделан статическим.Поэтому, чтобы вызвать его, вам нужен экземпляр b (который у вас есть в c).Вы можете передать это в свою функцию в a, но на самом деле в этом случае я не понимаю, зачем вам понадобится несколько экземпляров b.

Обратите внимание, что из вашего кода b еще не объявлено в заголовкео.Для правильной обработки зависимостей ваш код должен быть перекомпонован.

0 голосов
/ 11 января 2012

Если вы передадите this в ca и cb, вы можете использовать его для доступа к cb и ca соответственно.

class a {
    public:
        a(c *parent) : _parent(parent) {}
        aa() { parent->cb.bb(); }

    private:
        c *_parent;
};

class c {
    public:
        c() : ca(this), cb(this) {}

    ...
0 голосов
/ 11 января 2012

если все три класса находятся в одном файле, ваш код должен работать нормально.

однако, если у вас есть отдельные файлы заголовков, включите эти файлы заголовков в файл, содержащий class C.

Предпочитаю комментарий Эда Хила, чем мой ответ.

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