C ++使用struct作为类的参数

时间:2016-06-20 09:12:53

标签: c++ class struct header-files

我只是不知道如何使这个工作,另一个好问题“在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;
}

类头文件

// myClass.h

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

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

和另一个带有类定义的源文件

// 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头文件中,所有错误都消失了。

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

4 个答案:

答案 0 :(得分:4)

你有2个解决方案:

  1. 将myStruct放入myClass.h
  2. 在myClass.h中转发声明myStruct
  3. 基本上你需要确保当有人读取(包括)myClass.h时,他们也会知道myStruct存在,并且每个需要myStruct的人都能以某种方式访问​​它。

    你不能转发声明myStruct,然后在你需要它的地方定义它,因为它打破了one-definition-rule,但你可以在myClass标题或专用标题中使用它。

答案 1 :(得分:1)

如果您只在标题中使用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();
};

答案 2 :(得分:0)

使用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来访问它。当一个struct非常特定于一个类时,我喜欢这个,因为你被迫使用它的全名,并且不会发生命名空间冲突或者这样的事情。

// 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)
{};

答案 3 :(得分:0)

索林说的是什么。另外,你可以转发声明类并使用它的指针,如果我没有弄错,这将不需要实际的“#include”。