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 个解决方案:
- 将 myStruct 放入 myClass.h
- 在 myClass.h
中转发声明 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”。
我只是不知道如何让它工作,还有另一个好问题 "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 个解决方案:
- 将 myStruct 放入 myClass.h
- 在 myClass.h 中转发声明 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”。