1

各インデックスに空の文字列を割り当て、後で を関数addB()の値に置き換えることになっています。 私はこれにかなり新しいので、私は多くの問題を抱えています。クラスコンストラクタ内で動的に割り当てられた配列を初期化する方法

class A //in a.h 

{ 

    private: 

    B * b; 

    int maxNumberOfItems; 

    //... 

    public: 

    A(); 

    ~A(); 

void addB(const B & something); 

}; 

//in a.cpp 

A::A() 

    { 

    maxNumberOfItems=10; 
    for(int i=0;i<maxNumberOfItems;i++) 
    { 
     b[i]="";//has to be an empty string, I am getting a segmentation fault 
    } 

    } 

    A::~A(){/*...*/} 

    //... 

//in b.h 

class B 
{ 

private: 

     string name; 

     int price; 

    public: 

     void setName(string); 

     string getName(); 

     void setPrice(); 

     int getPrice(int); 

     B & operator=(string &); 

}; 

//in b.cpp 

B & B::operator=(string & a){name = a;price = 0; return *this;} 
//... 

これを使用すると、セグメント・フォールトを得るよう

+0

'b'は初期化されていないポインタのようです...メモリを割り当てるために_how_を知りたいですか? –

+0

あなたの 'b'は割り当てられていません。 [operator new \ [\]](http://en.cppreference.com/w/cpp/memory/new/operator_new) –

+0

部屋の象:動的配列の代わりに 'std :: vector'を使い、可能なら。 – user4581301

答えて

3

class Aが動的配列クラスのことになっているように見えますB

class A //in a.h 

{ 

private: 

    B * b; 

    int maxNumberOfItems; 

    //... 

public: 

A(); 

~A(); 

void addB(const B & something); 

}; 

//in a.cpp 

A::A() 

{ 
    maxNumberOfItems=10; 
    b = new B[maxNumberOfItems]; 

    for(int i=0;i<maxNumberOfItems;i++) 
    { 
    b[i]="";//has to be an empty string, I am getting a segmentation fault 
    } 

} 

A::~A(){/*...*/} 

//... 

//in b.h 

class B 
{ 

private: 

    string name; 

    int price; 

public: 

    void setName(string); 

    string getName(); 

    void setPrice(); 

    int getPrice(int); 

    B & operator=(string &); 

}; 

//in b.cpp 

B & B::operator=(string & a){name = a;price = 0; return *this;} 
+0

ループは必要ありません。 'b =新しいB [maxNumberOfItems]();' – juanchopanza

2
maxNumberOfItems=10; 
//add this line to your code 
b = new B[maxNumberOfItems]; 
//do some error check stuff 
for(int i=0;i<maxNumberOfItems;i++) 
{ 
    b[i]="";//has to be an empty string, I am getting a segmentation fault 
} 

あなたは、B [i]のためのメモリを割り当てません。私の問題を示すプログラムの唯一の抜粋です。あなたは、動的array.Iを使用する前に、メモリを割り当てる必要があります

+0

ありがとう、私は完全にメモリを忘れてしまった。 – ArcheAngel

+0

@ArcheAngel終了したら、割り当てられたメモリを忘れずに削除してください。 –

+0

ループは必要ありません。 @ bim = new B [maxNumberOfItems](); ' – juanchopanza

3

ためのメモリを割り当てられています。

Aの新しいインスタンスを作成するときには、配列bにもメモリを割り当てる必要があります。これはメモリ内のある点へのポインタです。投稿したコードから、初期化されず、任意のランダムなメモリ場所を指し示すことができます。これはうまくいきません(つまり、あなたのsegfaultの可能性が高い原因)。

以下の変更を行うことをおすすめします。

A::A(){ 
    maxNumberOfItems=10; 
    b = new B[maxNumberOfItems]; // b is an array of B objects. 
           // with default constructed values 
    // This way avoids the need for using a for loop and reassigning values 
} 

~A(){ 
    if (b != NULL) { delete b; } 
} 

class B{ 
    private: 
    //.... 
    public: 
    B(): name(""), price(0) {} 
    // Although the default constructor without defining one should behave the same. 
    // This just makes it explicit. what name and price default to. 
} 
関連する問題