我只是不知道如何使这个工作,另一个好问题“在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头文件,并且是我定义这个结构的唯一地方?这是编码的正确方法吗?
答案 0 :(得分:4)
你有2个解决方案:
基本上你需要确保当有人读取(包括)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)