2011-05-18 82 views
-3

嗨 我對C++很陌生。我只寫一個C++代碼這是繼:C++編程問題2

#include<iostream> 
using namespace std; 
class complex 
{ 
float x,y; 
}; 
int main() 
{ 
    complex a; 
    a.x=500; 
    a.y=600; 
cout<<" the value of a.x = "<<a.x<<"\n" ; 
cout<<" the value of a.y = "<<a.y<<"\n" ; 

return 0; 
} 

當我編譯程序它給我以下錯誤:

try.cpp: In function ‘int main()’: 
try.cpp:5: error: ‘float complex::x’ is private 
try.cpp:10: error: within this context 
try.cpp:5: error: ‘float complex::y’ is private 
try.cpp:11: error: within this context 
try.cpp:5: error: ‘float complex::x’ is private 
try.cpp:12: error: within this context 
try.cpp:5: error: ‘float complex::y’ is private 
try.cpp:13: error: within this context 

我剛好聲明數據成員公開糾正錯誤;

現在我該怎麼做才能使這件事情與私人成員一起工作? 爲什麼我無法訪問帶有課堂對象的私人成員? 如何直接訪問私有數據成員或爲什麼我不能直接使用類對象的數據成員?它背後的原因是什麼?

class是如何在內存中實現的?班級如何阻止我們或阻止我們使用其私人數據或實現其安全機制?什麼是編譯器在看到一個類時做什麼? 編譯器如何實現該類及其安全機制?

如果你讓他們private請給我講解一下

+1

你使用什麼教程來學習C++? – 2011-05-18 05:01:43

回答

3

Now what should i do to make this thing work with private member?

,那麼你可以寫構造函數,並添加其他有用的功能,以您的課,做你的複雜對象的操作:

class complex 
{ 
    float _x; 
    float _y; 
    public: 
     complex(float x=0.0, float y=0.0) : _x(x), _y(y) {} 
             //^^^^^^^^^^^^^its initialization list! 

     complex operator + (const complex & c) 
     { 
      return complex(_x + c._x, _y + c._y); 
     } 
     ostream & print(ostream & out) const 
     { 
      return out << "(" << _x << ", "<< _y << ")"; 
     } 
     void print() const 
     { 
      print(cout); 
      cout << endl; 
     } 

     //and so on 
}; 

ostream & operator << (ostream & out, const complex &c) 
{ 
    return c.print(out); 
} 

測試:

int main() 
{ 
    complex a(500,600); 
    complex b(80,60); 
    complex c = a + b; //operator+() gets invoked! 

    a.print(); 
    b.print(); 
    c.print(); 

    cout << "\nprint using cout!" << endl; 
    cout << a << endl; 
    cout << b << endl; 
    cout << c << endl; 
    return 0; 
} 

輸出:

(500,600) 
(80,60) 
(580,660) 

print using cout! 
(500,600) 
(80,60) 
(580,660) 

查看在線演示:http://www.ideone.com/TiGat

+0

只是說,你忘了在你的y作業裏添加一個「=」符號。 – 2011-05-18 05:00:59

+0

好吧,我不明白你的構造函數的概念。這是什麼類型的構造函數。我沒有找到任何這種類型的構造函數。你能解釋一下這個類型構造函數的工作嗎?我沒有得到operator +的概念。它是什麼?代碼如何工作?請解釋 。我的其餘問題呢。 – user513164 2011-05-18 05:14:41

+3

@ user513164:這就是所謂的初始化列表。還有其他問題。獲取關於C++的書籍。你需要先閱讀一些好書。 – Nawaz 2011-05-18 05:17:22

0

a.xa.y正試圖從類的外部訪問xy成員。如果他們不公開,那麼這些嘗試就會失敗,就像你所看到的那樣。

如果您希望默認訪問是公開的而不是私人的,請使用struct而不是class

+1

thanx尋求幫助,但我知道,但我問的其餘問題呢。請詳細閱讀我的問題 – user513164 2011-05-18 05:17:46

+1

@ user513164,如果你不知道公共和私人之間的區別,那麼我無法幫助你。這是非常基本的東西。 – 2011-05-18 05:26:02

+0

pal知道所有關於這個訪問說明符的東西,但所有我想知道內存中會發生什麼。內存中如何實現。編譯器在看到類名時做了什麼?它如何炒作或實現oops的不同現象 – user513164 2011-05-18 05:44:22

0

默認情況下,您在類中定義的字段是「私有」的,只能由該類的方法使用。

您需要將x和y定義爲該類的「公共」成員。

class complex 
{ 
public: 
float x,y; 
}; 
+1

請仔細閱讀我的問題 – user513164 2011-05-18 05:08:06

0

publicprivateprotected是編譯時的概念。在運行期間,它們甚至不存在。清理完畢後,讓我們繼續前往爲什麼不能訪問private數據。

private就是它說的 - PRIVATE。這是完全的,除了班級本身之外,不能從任何地方訪問。默認情況下,一個class是私有的,直到另外指定。
默認情況下,您想要public,請撥打struct。除了默認的「隱私」外,他們完全一樣。

struct complex{ 
    float x; 
    float y; 
}; 

現在你可以從任何地方訪問成員。


對於進一步的東西,從我的你的問題的印象,好像你really really need a good C++ book

+0

Pal我知道這個概念,我想知道存儲器內部發生了什麼或者這個安全機制是如何實現的。什麼是在機器內運行。就像我們知道當我們聲明一個數組時,指針在內存中形成,而數組的其餘部分使用這個基地址和下標作爲偏移量。類似地,我想知道類是如何實現內存中發生了什麼的。什麼編譯器在類名上做什麼或者編譯器如何實現一個類? – user513164 2011-05-18 05:25:46

+0

@user:嗯,這是第一句話。編譯後不存在安全性。如果你看看彙編,它甚至不知道指針以外的類型!基本上,編譯器只會檢查你是否被允許這樣做。這就是爲什麼你可以通過hacky轉換來實際訪問這些東西,與'const'一樣,這也只是一個編譯時的概念。 – Xeo 2011-05-18 05:29:02

+0

需要更多的細節和解釋關於類 – user513164 2011-05-18 05:40:19

0

數據保護和抽象是面向對象編程的基本概念。除了馬克的回答,我建議你讀任何你喜歡的C++編程++或書籍像埃裏克·納格勒的C,A牽手方法C++入門等

+0

Pal我非常瞭解這些概念,所以請仔細閱讀我的問題 – user513164 2011-05-18 05:29:43

+0

對不起,誤解了你的問題。我會更新我的答案 – sarat 2011-05-18 14:18:22

0

訪問類的私有成員,您可以:

  1. 提供讀取和寫入私有成員值的公共方法。這樣,班級可以完全控制訪問操作。
  2. 提供公共方法來返回私人成員的指針或引用。這不是一個好方法,因爲物體的狀態可能會被破壞。
  3. Declear類或功能作爲包含私人成員的類的朋友,以便朋友可以訪問所有成員。確保朋友們在班級的數據成員上正確運行。

私有,受保護和公共只在編譯時生效,防止錯誤代碼破壞對象的狀態。他們沒有運行時安全控制的業務。

讓我們舉個例子,看看下面簡單的Stack類:

class statck 
{ 
private: 
    static const int buffersize = 100; 
    int buffer[buffersize]; 
    int count; 
public: 
    stack(); 
    bool Push(int value); 
    bool Pop(int value); 
    int GetCount(); 
} 

計數memeber邏輯上代表多少價值已經被壓入堆棧,它的值是通過PUSH,POP和構造管理,及不應該通過使用堆棧類對象的代碼進行更改,例如:

statck s; 
s.count = 10; 

代碼優勢在邏輯上無意義。如果計數是公開的,代碼可以被編譯,並且錯誤更難以顯示,並且通過將計數明確爲私有,錯誤是顯而易見的並且導致編譯錯誤。

所有訪問修飾符(public,protected和private)的做法是告訴編譯器,類的成員可以出現在類的成員方法以外的代碼中的某些表達式中。我沒有使用「訪問」這個詞,我認爲這就是你所困惑的。

訪問修飾符不會影響編譯器爲了表示對象而產生的內存佈局。嚴格來說,佈局取決於編譯器和平臺的字大小,但通常在32位系統上,statck對象將是404字節長的內存塊,400字節用於緩衝區,4字節用於計數,無論緩衝區和計數是否公開或私人。當程序運行時,每個獲得404字節內存塊地址的代碼都可以讀寫它們,私有與此無關。

+0

朋友我最喜歡你的答案你會解釋我什麼是對象狀態■它是如何創建或實現的 – user513164 2011-05-18 06:31:01

+0

好吧,「對象狀態」不是一個正式術語,我個人使用這個短語來指代邏輯一個對象的數據成員值及其關係的正確性。看到我添加到答案的例子。 – 2011-05-18 08:02:31