2013-06-22 149 views
1

我正在學習OOP的第一步。這是我無法解決的第一個問題。 此類中的最大值函數應返回兩個數字的最大值。我想保留私人範圍內的數字和公共範圍內的功能。但是當我想在公共範圍使用struct data{}的變量時,編譯器會說變量沒有被聲明。請告訴我爲什麼我會得到這些錯誤。在課堂上做結構

class myclass{ 
private: 
    struct data{ 
     int q ; 
     int w; 
    }; 

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; 
    } 

}; 
+0

你爲什麼要一個班級呢?我想,函數模板會更合適。無論你需要'data'結構的*實例*作爲'myclass'的成員變量,而不是作爲get()函數的局部範圍變量。 – WhozCraig

+0

http://stackoverflow.com/questions/1609372/how-do-i-declare-a-struct-within-a-class –

+0

...或http://stackoverflow.com/questions/16930296/access-member-of-structure-a-class/16930355#16930355 ... – Pixelchemist

回答

2

在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++:樣板語言。

+0

非常感謝, – Sam379

+0

np - 修正了幾個錯別字等 - 希望他們澄清 – kfsone

5
struct data{ 
    int q ; 
    int w; 
}; 

只聲明一個類型,而不是一個對象,所以有沒有在任何地方和q成員wclass實例中。您需要聲明struct實例

struct { 
    int q; 
    int w; 
} data; 

然後,你可以寫max爲:

int max() 
{ 
    if (data.q > data.w) 
     return data.q; 
    else 
     return data.w; 
} 

(我不知道你的get方法是應該做的,所以我有沒有更換了點。)

+0

'get'看起來應該命名爲'set'代替;) – Pixelchemist

1

您已定義結構,但沒有該類型的對象。你應該聲明一個對象,你不會得到任何錯誤。

class myclass{ 
private: 
    struct data{ 
     int q ; 
     int w; 
    }var; 

public: 
    void get(int a, int b){ 
    var .q= a; 
    var.w=b; // here I want to pass the variables to data struct 
    } 
    int max(){    // this function returns the biggest number 
     if(var.q>var.w) 
     return var.q; 
     else 
      return var.w; 
    } 

};