在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 { ... };
};
這兩個結果類避免命名空間衝突,通過被數據庫::結果和考試結果::而不只是「結果」。
但是 - 這些只是定義。他們沒有 - 如圖所示 - 對邊遠班有任何影響,即:他們不被用來爲班級添加成員。
您的代碼:
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的::數據」,但不型「MyClass的::數據」的成員添加到類。 「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++:樣板語言。
你爲什麼要一個班級呢?我想,函數模板會更合適。無論你需要'data'結構的*實例*作爲'myclass'的成員變量,而不是作爲get()函數的局部範圍變量。 – WhozCraig
http://stackoverflow.com/questions/1609372/how-do-i-declare-a-struct-within-a-class –
...或http://stackoverflow.com/questions/16930296/access-member-of-structure-a-class/16930355#16930355 ... – Pixelchemist