【问题标题】:C++ pass struct from from one class to another classC ++将结构从一个类传递到另一个类
【发布时间】:2016-10-03 20:29:51
【问题描述】:

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

#ifndef _A_H
#define _A_H
#include B.h
namespace common {
    class A {
    public:
        static struct strctOfA {
           float p1 = 2;
        } structA;
        void functionOfA();
    };
}
#endif // !_A_H

A.cpp

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

B.h

#ifndef _B_H
#define _B_H
namespace common {
    class B {
    public:
         functionOfB(??);
    };
}
#endif // !_B_H

B.cpp

#include B.h
using namespace common;
B::functionOfB(??) {
        // Want to use structA here;        
}

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

谢谢

更新 感谢 I-V 指出错误并为我提供解释。更新代码对我有用。感谢大家为我的 C/C++ 编码技能提供额外的知识。 :)

【问题讨论】:

  • 您的 #include 语法有问题。这些真的是你的源文件吗?
  • 这真的没那么难。使用包含保护,并包含您关心的类的头文件。
  • 嘿马库斯,我已经为我的代码创建了一个类似的场景。 @JonathonReinhart:你能详细说明一下吗?
  • 您没有提出真正的问题。你刚才说“会导致循环依赖”。您是否遇到任何编译时或运行时错误?如果是这样,请明确并询问这些问题。
  • @MilanJain 然后你需要重新设计你的代码。否则,接受我的指示,使用include guards,然后继续。

标签: c++ class struct arguments


【解决方案1】:

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

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

它还可以解决你拥有的包含的循环..

一般来说,当你不使用头文件中包含的文件的函数/对象时,建议将文件包含在.cpp文件中而不是头文件中:)

此外,您应该在 Windows 上使用 #pragma 一次,在其他任何东西上使用 ifndef 以防止冲突

啊.h

#ifndef _A_H
#define _A_H
namespace common {
    class A {
    public:
        static struct strctOfA {
           float p1 = 2;
        } structA;
    }
}
#endif

A.cpp

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

注意:从 B.cpp 包括 A.h

【讨论】:

  • 我包含了 B.h 来调用它的函数。您将在 A.cpp 中进行检查。不过,感谢后面部分的建议。我不知道。
  • 但是你不能在头文件中实现任何东西!你怎么能在 A.h 中调用一个函数??
  • 不客气 :) 唯一的例外是使用模板时...然后您在头文件中实现但编译和链接不同
  • 太棒了!谢谢男人:)
  • "但是你不能在头文件中实现任何东西!" 通常应该避免在头文件中实现,但是“不能”这个词太强了。以模板为例。它们通常需要在头文件中实现。
【解决方案2】:

这可以通过前向声明来完成,除非您绝对必须按值传递它。但我想不出这不适用于引用的场景。

啊.h

#ifndef A_H_
#define A_H_

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

#endif

A.cpp

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

B.h

#ifndef B_H_
#define B_H_


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

#endif

B.cpp

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

如果您只需要前向声明的 A 中的 B 值,您可以将其放在指针中,即使用 std::unique_ptr。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多