Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将结构从一个类传递到另一个类_C++_Class_Struct_Arguments - Fatal编程技术网

C++ C++;将结构从一个类传递到另一个类

C++ C++;将结构从一个类传递到另一个类,c++,class,struct,arguments,C++,Class,Struct,Arguments,我在A.h,A.cpp和B.h,B.cpp中分别定义了两个类别A和B。类A有一个我想在类B的函数中使用的结构。因为类B包含在类A中,所以我不能将类A包含在类B中,因为它会导致循环依赖。所有文件的代码如下所示: A.h A.cpp B.h B.cpp 我查看了StackOverflow,发现了一个与我的问题非常接近的问题,但是,他们要么没有解释答案,要么我无法理解他们的解决方案。请帮我做这个 谢谢 更新 谢谢I-V指出错误并给我解释。更新代码对我来说很有效。感谢大家为我的C/C++编码技能提供了更

我在A.h,A.cpp和B.h,B.cpp中分别定义了两个类别A和B。类A有一个我想在类B的函数中使用的结构。因为类B包含在类A中,所以我不能将类A包含在类B中,因为它会导致循环依赖。所有文件的代码如下所示: A.h

A.cpp

B.h

B.cpp

我查看了StackOverflow,发现了一个与我的问题非常接近的问题,但是,他们要么没有解释答案,要么我无法理解他们的解决方案。请帮我做这个

谢谢

更新
谢谢I-V指出错误并给我解释。更新代码对我来说很有效。感谢大家为我的C/C++编码技能提供了更多知识。:)

解决方法很简单,你写的是个坏习惯

没有理由在A.h中包含B.h,因为在A.h文件中没有使用B.h的任何部分。更好的实现方法是在A.cpp中包含B.h,而不是在头文件中

它还将解决你的收入循环问题

通常,如果不在头文件中使用包含文件的函数/对象,建议将文件包含在.cpp文件中,而不要包含在头文件中:)

此外,为了避免冲突,您应该对Windows使用#pragma一次,或对其他任何内容使用ifndef

A.h

A.cpp

#include A.h
#include B.h
using namespace common;
class A {
    B b;
    b.functionOfB(structA);
}

注意:从B.cpp包括A.h,这可以通过向前声明完成,除非您必须通过值传递它。但我想不出有哪一种场景不适合引用

A.h

A.cpp

B.h

B.cpp


如果您需要在a中有一个值B,并且只有一个正向声明,那么您可以将其放在指针中,即使用std::unique\u ptr。

您的
#include
语法有问题。这些真的是你的源文件吗?这真的没那么难。使用include-guard,并为您关心的类包含头文件@乔纳森莱因哈特:你能详细说明一下吗?你还没有提出一个真正的问题。您刚才说过“将导致循环依赖”。您是否遇到编译时或运行时错误?如果是这样,请明确地询问这些问题。@MilanJain,那么您需要重新设计代码。否则,接受我的指示,使用,然后继续。我包括了B.h来调用它的函数。您将在A.cpp中进行检查。不过,感谢后面的建议。我不知道。但你们不能在头文件中实现任何东西!你怎么能在a.h.中调用函数?不客气:)唯一的例外是在使用模板时。。。然后在头文件中实现,但是编译和链接是不同的!谢天谢地:)“但你们不能在头文件中实现任何东西!”通常应该避免在头文件中实现,但“不能”这个词太强了。以模板为例。它们通常需要在头文件中实现。
#include A.h
using namespace common;
A::functionOfA() {
    B b;
    b.functionOfB(structA);
}
#ifndef _B_H
#define _B_H
namespace common {
    class B {
    public:
         functionOfB(??);
    };
}
#endif // !_B_H
#include B.h
using namespace common;
B::functionOfB(??) {
        // Want to use structA here;        
}
#ifndef _A_H
#define _A_H
namespace common {
    class A {
    public:
        static struct strctOfA {
           float p1 = 2;
        } structA;
    }
}
#endif
#include A.h
#include B.h
using namespace common;
class A {
    B b;
    b.functionOfB(structA);
}
#ifndef A_H_
#define A_H_

struct B;
struct A {void f(B&);};

#endif
#include "B.h"
void A::f(B & value) {/* do something */ };
#ifndef B_H_
#define B_H_


struct A;
struct B {void f(B&);};

#endif
#include "A.h"
void B::f(A & value) {/* do something */ };