Я новичок в C++, но у меня есть некоторый опыт работы на Java. Во время кодирования я наткнулся на ошибку, которая смутила меня. Вот мой код (упрощенно, но ошибки одинаковы):C++: передача этого указателя в другой класс
Ач
#pragma once
#include "B.h"
class A
{
public:
A();
void foo();
void sayHello();
B b;
};
a.cpp:
#include "A.h"
#include <iostream>
A::A() {}
void A::foo() {
b.bar(this);
}
void A::sayHello() {
std::cout << "Hello" << std::endl;
}
Bh:
#pragma once
#include "A.h"
class B
{
public:
B();
void bar(A *a);
};
B.cpp:
#include "B.h"
B::B(){}
void B::bar(A *a) {
a->sayHello();
}
Я хочу передать указатель на объекта к бар функции в B, так что я буду иметь возможность изменять и доступ к a 's поля в bar. Как ни странно, я получаю эти ошибки, когда я называю Foo через экземпляр A из другого класса:
1>------ Build started: Project: Test, Configuration: Debug Win32 ------
1> main.cpp
1>d:\stuff\visual studio 2015\projects\test\test\b.h(7): error C2061: syntax error: identifier 'A'
1> B.cpp
1>d:\stuff\visual studio 2015\projects\test\test\a.h(9): error C3646: 'b': unknown override specifier
1>d:\stuff\visual studio 2015\projects\test\test\a.h(9): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1> A.cpp
1>d:\stuff\visual studio 2015\projects\test\test\b.h(7): error C2061: syntax error: identifier 'A'
1>d:\stuff\visual studio 2015\projects\test\test\a.cpp(5): error C2660: 'B::bar': function does not take 1 arguments
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
код работает отлично, если я не включаю Ах в Bh и я не 't передать что-нибудь на бар функция.
Я попытался Google, что может привести к этим ошибкам, но я не смог решить проблему самостоятельно, потому что я не понимаю, что вызывает эти ошибки. Что я делаю не так?
Ищите для 'cyclic includes' и' forward declaration' – Thomas
Циркулярное повторение. Подробнее здесь: http: //stackoverflow.com/questions/625799/resolve-circular-dependencies-in-c и здесь: http://stackoverflow.com/questions/17865286/c-circular-include и здесь: https://en.wikipedia.org/wiki/Circular_dependency. TL; DR: один из заголовков должен быть включен первым, и поскольку он включает в себя другой, другой не может включать первый, чтобы получить определения, которые ему нужны, поскольку первый уже включен. – user4581301