在 C++ 中,“类”和“结构”几乎是同义词(同一件事)。唯一的区别是“结构”默认为“公共”可访问性,而“类”默认为私有。
一旦你理解了这一点,很明显你正在做的是在你的类中定义一个子类型。
class myclass {
private: // <- not required, you already said that by saying "class".
struct data {
// <-- this is a class definition with "public:" just here.
...
};
};
C++ 允许您嵌套类/结构定义,例如,您可以创建编组参数或返回值的结构。
class Database {
class Result { ... };
};
...
class Exam {
class Result { ... };
};
这两个结果类通过成为 Database::Result 和 Exam::Result 而不仅仅是“Result”来避免命名空间冲突。
但是 - 这些只是定义。如图所示,它们不会对外围类产生任何影响,即:它们不被用于向类添加成员。
你的代码:
class myclass{
private:
struct data{ // <-- this is a TYPE declaration, struct myclass::data
int q ; //
int w; //
}; // <-- no member name here so does not affect myclass itself.
public:
void get(int a, int b){
struct data = {a , b}; // here I want to pass the variables to data struct
}
int max (){ // this function returns the biggest number
if(q>w)
return q;
else
return w;
}
};
声明类型“myclass::data”但不向类添加类型“myclass::data”的成员。“struct data =”行是非法的,您正在尝试将值分配给 TYPE。
它可能应该写成
class MyClass {
int m_q;
int m_w;
public:
void set(int q, int w) {
m_q = q;
m_w = w;
}
int max() const {
return (m_q > m_w) ? m_q : m_w;
// or #include <algorithm> and return std::max(m_q, m_w);
}
};
如果您要在类的范围之外重用该结构定义,则只需将 q & w 提升到一个结构中,例如在派生或并行类中,您可能想要添加更多相同类型的东西,在这种情况下,您也许可以执行以下操作,但如果您以这种方式执行此操作,您最终会因破坏封装而自责:
class MyClass {
public:
struct Data {
int m_q;
int m_w;
};
private:
Data m_data;
void set(int q, int w) {
m_data.m_q = q;
m_data.m_w = w;
}
int max() const {
return (m_data.m_q > m_data.m_w) ? m_data.m_q : m_data.m_w;
}
};
如果这种成员的耦合需要在某种程度上在外部可见,则更好的方法是:
class MyClass {
public:
class Data {
int m_q;
int m_w;
public:
Data() : m_q(0), m_w(0) {}
Data(int q, int w) : m_q(0), m_w(0) {}
void set(int q, int w) {
m_q = w;
m_w = w;
}
int q() const { return m_q; }
int w() const { return m_w; }
int max() const { return (m_q > m_w) ? m_q : m_w;
};
private:
Data m_data;
public:
MyClass() : m_data() {} // or = default
MyClass(int q, int w) : m_data(q, w) {}
MyClass(const Data& data) : m_data(data) {}
// Read-only access
const Data& data() const { return m_data; }
// To allow write access, e.g. for set:
Data& data() { return m_data; }
};
对于这样一个简单的案例来说,这有点矫枉过正,但欢迎使用 C++:样板语言。