2011-08-16 155 views
-1

我相信這是一個基本問題,但是當我認爲我正確地做到這一點時,我不斷收到內存訪問錯誤。C++成員變量指針

我想要做什麼:

class A{ 
    string name; 
    string date; 
} 

main{ 
    A *a = new A(); 
    a->name= someFunct(); 
    a->date= someFunct(); 

    B b; 
} 
class B{ 
    A *a; 
    printf("%s", a->name); //retrieving data set in main 
} 

我基本上需要在一個類中分配一些整體設置,並希望能夠在整個應用程序訪問的最有效的方式這些設置。

+0

凡B中使用,它是如何初始化? – murrekatt

+1

我沒有遵循最後的部分 - 我不認爲這將編譯爲現在,我不完全確定你的意思。 B中的A * a是否完全相同? – Rup

+0

@Rup所以我想要做的是在main中創建一個對象,並將數據分配給成員變量。從主創建的任何其他對象我希望能夠訪問該數據。很顯然,我做錯了什麼,我不知道是什麼? – JonnyCplusplus

回答

0

除了Andreas的答案,你是不是初始化*一個在B.只是因爲它們被命名爲相同並不意味着它們都指向同一件事。你需要說一些像

b.a = new A(); 

在你的主。否則b.a是一個空指針。

即,您需要在您的b實例上創建一個實例。或者讓一位接近當前的代碼,你可以這樣做:

int main(char* args[]){ 
    A *a = new A(); 
    a->name= someFunct(); 
    a->date= someFunct(); 

    B b; 
    B.a = a; 
    return 0; 
} 
+0

'main'需要返回類型。 –

+0

@Tomalak Geret'kal - 我只是堅持原始示例中使用的僞代碼風格。如果這是真實的代碼,那麼它會,以及一個正確的簽名等 –

+0

如果這是僞代碼,那麼誰說,原代碼是錯的?或者說'B.a = a'是有效的? :) –

3

您正在將std :: string傳遞給printf,您需要傳遞一個c字符串。

printf("%s", a->name.c_str()) 
+0

啊,是的,這是一個鬼鬼祟祟的問題。 – murrekatt

0

也許這將是太有用:

class A 
{ 
public: //you forgot this 
     //defaut is private 
    string name; 
    string date; 
}; 

int main() 
{ 
    A *a = new A(); 
    a->name = someFunct(); 
    a->date = someFunct(); 

    delete a; //maybe you should do it 
} 

class B 
{ 
    A *a; 

    ..... 
    printf("%s", a->name.c_str()); 
    ..... 
}; 
+1

B類中的指針a沒有在這裏初始化 –

+0

@jamesj原創來源作者根本不使用B類 –

+0

確切地說,B怎麼能指向任何東西。我同意你的評論關於違約私人,但錯過了。 –