2011-08-16 22 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

? – murrekatt

+1

私は最後の部分には従いません - 私はそれがそのままコンパイルされるとは思わないし、あなたが何を意味するかは完全にはわかりません。それはBでも間違いなくA * aですか? – Rup

+0

@Rupそれでは、メインにオブジェクトを作成し、メンバー変数にデータを割り当てます。メインから作成された他のオブジェクトは、そのデータにアクセスできるようにしたい。だから明らかに私は間違ったことをしています。私は何が分かりませんか? – JonnyCplusplus

答えて

0

、あなたは彼らは同じ名前が付けられたからといってBに* Aを初期化していないと、彼らは同じものを指していることを意味するものではありません。

b.a = new A(); 

のようにする必要があります。それ以外の場合は、b.aは空のポインタです。

e。 bインスタンス上にaのインスタンスを作成する必要があります。

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

あなたはprintfにstd :: stringを渡していますが、c文字列を渡す必要があります。 Andreasの答えに加えて

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

ああ、これは卑劣な問題です。 – murrekatt

0

は多分これがあまりにも有用であろう:またあなたができるあなたの現在のコードに近いビットを維持する

Bが使用され、それがどのように初期化しない
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の* aが何かを指し示すことができます。私はプライベートにあなたのコメントについて同意するが、それを逃した。 –

関連する問題