Sono nuovo al C++ ma ho una certa esperienza in Java. Durante la codifica, mi sono imbattuto in un errore che mi ha confuso. Ecco il mio codice (semplificato, ma gli errori sono gli stessi):C++: passando il puntatore a un'altra classe
Ah:
#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();
}
voglio passare un puntatore del un oggetto alla funzione bar in B, in modo che sarò in grado di modificare e accesso a campi in bar. Stranamente, ottengo questi errori quando chiamo foo attraverso un'istanza di Un da un'altra classe:
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 ==========
Il codice funziona bene se non includo Ah in Bh e io don non passare nulla alla funzione bar.
Ho provato a google cosa potrebbe causare questi errori ma non sono stato in grado di risolvere il problema da solo perché non capisco cosa causa questi errori. Che cosa sto facendo di sbagliato?
cercare "includi ciclici" e "dichiarazione anticipata" – Thomas
Rifiuto circolare. Maggiori informazioni qui: http: //stackoverflow.com/questions/625799/resolve-circular-dependencies-in-c e qui: http://stackoverflow.com/questions/17865286/c-circular-include e qui: https://en.wikipedia.org/wiki/Circolare_dipendenza. TL; DR: una delle intestazioni deve essere inclusa per prima e poiché include l'altra, l'altra non può includere la prima per ottenere le definizioni necessarie perché la prima è già stata inclusa. – user4581301