Включает и направляет декларацию в C ++ - PullRequest
0 голосов
/ 23 марта 2012

Я прочитал множество тем по этому вопросу и следовал инструкциям на http://www.eventhelix.com/RealtimeMantra/HeaderFileIncludePatterns.htm,, но у меня все еще возникают проблемы с включениями.

Чтобы убедиться, что у меня нет другихОшибка в моем реальном коде, я написал и попытался точно скомпилировать следующий код.

Ач:

#ifndef A_H
#define A_H
class A
{
public:
    A(){};
    void myMethod() const;
};
#endif

A.cpp:

#include "A.h"
#include <iostream>
void A::myMethod() const
{
    std::cout << "Hooray!" << std::endl;
}

Bh:

class A;

#ifndef B_H
#define B_H
class B
{
    const A* aInstance;
public:
    B(){};
    void useA() const;
};
#endif

B.cpp:

#include "B.h"

void B::useA() const
{
    aInstance.myMethod();
}

main.cpp:

#include "A.h"
#include "B.h"

int main()
{
    B bInstance;
    bInstance.useA();
    return 0;
}

Команда компиляции:g++ main.cpp A.cpp B.cpp

Ошибка:

B.cpp: In member function ‘void B::useA() const’:
B.cpp:5:15: error: request for member ‘myMethod’ in ‘((const B*)this)->B::aInstance’, which is of non-class type ‘const A* const’

Я действительно начинаю расстраиваться.Как заставить класс B использовать класс A?Мы не добрались до указателей и более крупных проектов в классе C ++, который я взял, и из того, что я прочитал, я действительно чувствую, что понимаю, что здесь происходит, но я не знаю, почему это не работает,

Спасибо за любую помощь.Вы будете делать все мои выходные.

Ответы [ 3 ]

3 голосов
/ 23 марта 2012

Это:

aInstance->myMethod();

не

aInstance.myMethod();

, поскольку aInstance является указателем на A, а не A объектом.

Такжев B.cpp необходимо #include "A.h".

РЕДАКТИРОВАТЬ:

Ваш код приводит к неопределенное поведение .aInstance не инициализирован, и вы вызываете myMethod в нем.Поскольку это не метод virtual и вы не обращаетесь ни к одному из членов A, он, вероятно, будет работать, но, тем не менее, это неправильно.Вы должны инициализировать его в конструкторе B:

B() : aInstance(new A) {};
1 голос
/ 23 марта 2012

In B.cpp также включает A.h:

#include "A.h"  //include this as well
#include "B.h"

void B::useA() const
{
    aInstance->myMethod(); //also use -> not .
}

A.h включено, чтобы компилятор мог знать, что aInstance имеет функцию-член под названием myMethod.

0 голосов
/ 23 марта 2012

Сначала вам нужно создать экземпляр объекта

const A* aInstance;

и затем измените код

void B::useA() const
{
    aInstance->myMethod();
}
...