【发布时间】:2016-07-20 14:52:00
【问题描述】:
我是 C++ 新手,但我确实有一些 Java 经验。 在编码时,我偶然发现了一个让我感到困惑的错误。 这是我的代码(简化,但错误相同):
啊:
#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;
}
B.h:
#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();
}
我想将a对象的指针传递给B中的bar函数,这样我就可以修改了并访问 a 在 bar 中的字段。奇怪的是,当我通过另一个类的 A 实例调用 foo 时,我得到了这些错误:
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 中不包含 Ah 并且我没有将任何内容传递给 bar 函数,则代码可以正常工作。
我尝试用谷歌搜索可能导致这些错误的原因,但我无法自己解决问题,因为我不明白是什么导致了这些错误。我做错了什么?
【问题讨论】:
-
寻找
cyclic includes和forward declaration -
循环引用。更多在这里:stackoverflow.com/questions/625799/… 和这里:stackoverflow.com/questions/17865286/c-circular-include 和这里:en.wikipedia.org/wiki/Circular_dependency。 TL;DR:必须首先包含一个标头,因为它包含另一个标头,所以另一个标头不能包含第一个以获得它需要的定义,因为第一个标头已经包含在内。
标签: c++ pointers parameter-passing this member