C++ 使用结构作为 class 的参数

C++ using a struct as a argument for a class

我只是不知道如何让它工作,还有另一个好问题 "Passing a struct as a constructor parameter in C++" 虽然我解决了我所有的问题,但我只是不明白为什么我的代码不能工作。我有三个文件:一个源文件

// A.cpp

#include "myClass.h"

int main()
{
    struct myStruct {
        double a; 
        double b; 
    };

   myStruct structName;
   structName.a = 1.1;
   structName.b = 2.2;

   myClass myClassObject(60.0, structName);

   return 0;
}

一个class头文件

// myClass.h

class myClass {
    private:
        double m_value; 
        double m_a; 
        double m_b; 

    public:
        myClass(double value, struct myStruct);
        ~myClass();
};

和另一个具有 class 定义的源文件

// myClass.cpp

#include "myClass.h"

myClass::myClass(double S, const myStruct &s): m_value(S), m_a(s.a), m_b(s.b) {};
myClass::~myClass(){};

我遇到各种错误,比如在 myClass 源文件中我得到错误:没有重载函数实例 "myClass::myClass" 与指定类型匹配。

现在如果我删除

struct myStruct
{
    double a; 
    double b; 
};

从 A cpp 源文件中取出并放入 myClass 头文件中,所有错误都消失了。

Q) struct 声明是否应该进入 myClass 头文件,并且是我定义这个结构的唯一地方?这是正确的编码方式吗?

您有 2 个解决方案:

  1. 将 myStruct 放入 myClass.h
  2. 在 myClass.h
  3. 中转发声明 myStruct

基本上你需要确保当有人阅读(包括)myClass.h 他们也知道 myStruct 存在并且每个需要 myStruct 的人都可以通过某种方式访问​​它。

您不能转发声明 myStruct 然后在需要的地方定义它,因为这会破坏 one-definition-rule,但您可以将它放在 myClass header 或专用的 header.

如果您仅在 headers 中使用对 myStruct 的引用和指针,前向声明就足够了。

struct myStruct; // < Forward declaration will cause 'incomplete type' error

class myClass {
    public:
        myClass(double value, const struct& myStruct); // < Passing by reference
        ~myClass();
}

但是当你使用实例(或按值传递)时,编译将需要定义结构

// Forward declaration will cause 'incomplete type' error
#include "myStruct.h" // < Compiler should see full declaration of structure

class myClass {
    public:
        myClass(double value, struct myStruct); // < Passing by value
        ~myClass();
};

在任何使用 myStruct(访问它的实例)的地方,您都需要知道它的定义。

因为 myStruct 似乎与 myClass 关联,所以在 myClass.h:

中定义它是有意义的
// myClass.h

struct myStruct {
        double a; 
        double b; 
    };

class myClass {
    private:
      :
    public:
        myClass(double value, struct myStruct);
        ~myClass();
};

你甚至可以进一步缩小范围,如果它是特定于 myClass 的,那么你可以使它成为 myClass 的成员,然后你需要显式地使用完整类型 myClass::myStruct 来访问它。当一个结构非常特定于一个结构时,我喜欢这样 class 因为你被迫使用它的全名并且不会发生命名空间冲突或类似的事情。

// myClass.h

class myClass {
    public:
        struct myStruct {
            double a; 
            double b; 
        };

        myClass(double value, struct myStruct);
        ~myClass();
};

然后在 main.cpp 中使用它,例如:

// A.cpp

#include "myClass.h"

int main()
{   
   myClass::myStruct structName;
   structName.a = 1.1;
   structName.b = 2.2;

   myClass myClassObject(60.0, structName);

   return 0;
}

在myClass.cpp中你使用完整类型:

// myClass.cpp

#include "myClass.h"

myClass::myClass(double S, const myClass::myStruct &s): 
    m_value(S),
    m_a(s.a),
    m_b(s.b)
{};

索林说的。此外,您可以转发声明 class 并使用它的指针,如果我没记错的话,这将不需要实际的“#include”。