2

簡単なプログラムを書いています。その中のクラスは1つだけです。プライベート メンバー 'char * number' と 2 つの関数があります (さらに多くの関数がありますが、最初にこれらが正しく動作するはずです:))。

最初のものは「ソース」を「数値」変数にコピーする必要があります(そして、ここのどこかに問題があると思います):

LongNumber::LongNumber(const char * source ){
        int digits = strlen(source);

        char* number = new char[digits+1];
        strcpy( number, source );
        //  cout<<number<<endl; - if the line is uncommented,
        //  the output is correct and there isn't a problem

}

そして印刷機能:

void LongNumber::print(){
    cout<<number<<endl;
    // when I try to print with the same line of code here..it crashes
}

確かに、私は何かが欠けています...しかし、何ですか?

(これは私の最初の投稿です...タグは修正されていると思いますか..どのように投稿にタグを付けましたか?)

前もって感謝します :)

4

4 に答える 4

6

number char* 配列は、コンストラクターを終了すると範囲外になります。print() に到達すると、プログラムは *number が最初に指していたメモリにアクセスできなくなるため、プログラムはクラッシュします (つまり、セグメンテーション違反)。この問題を解決するには、代わりに次のようにします。

class LongNumber
{
     char *number;
     LongNumber(const char *source);
     ~LongNumber();
     void print();
};

LongNumber::LongNumber(const char * source ){
        int digits = strlen(source);

        number = new char[digits+1];
        strcpy( number, source );    
}

void LongNumber::print(){
    cout<<number<<endl;
}

次のことを忘れないでください。

LongNumber::~LongNumber()
{
    delete [] number;    // to avoid memory leaks
}

また、*number 変数に char* を使用するのではなく、STL::string を使用することを強くお勧めします。これは、メモリ管理のオーバーヘッドを自分で処理する必要がなく、文字列のコピーも簡単になるためです。

于 2009-06-28T07:27:11.980 に答える
5

コンストラクターで、LongNumberという名前の新しいローカル変数を宣言し、新しい配列numberで初期化します。char

char* number = new char[digits+1];

代わりに、を省略してchar*、新しい変数宣言のように見えず、オブジェクト メンバー変数を使用するようにする必要があります。

number = new char[digits+1];

現在のコードでは、メンバー変数numberは初期化されず、後で使用するとprintエラーが発生します。

于 2009-06-28T07:23:49.303 に答える
1

あなたの問題はコンストラクターにあります:

LongNumber::LongNumber(const char * source )
{
  ...
  // you are declaring a new local variable called `number` here
  char* number = new char[digits+1];
  strcpy( number, source );
  ...
}

というクラスメンバー変数にコピーしているのではなくnumber、コンストラクターの本体で新しいローカル変数を宣言し、それを使用しています。クラス メンバー変数は使用されておらず、おそらく未定義です。ポインター メンバーの場合、これは値が無効な値である可能性があることを意味します。その場合、print を呼び出すと、次のようになります。

void LongNumber::print()
{
  cout<<number<<endl;
  // when I try to print with the same line of code here..it crashes
}

ここnumberで使用している はクラス メンバー変数であり、前に述べたように未定義です。への呼び出しcoutは、その無効なポインターを使用しようとするため、クラッシュします。

修正は、コンストラクターが正しいクラス メンバー変数を使用するようにすることです。

LongNumber::LongNumber(const char * source )
{
  ...
  // use the class member variable `number` here
  number = new char[digits+1];
  strcpy( number, source );
  ...
}
于 2009-06-28T07:29:08.293 に答える
1

ローカル変数として番号を宣言しているように見えます。別の関数で再度呼び出すことができるようにしたい場合は、クラス定義で宣言する必要があります...次のように:

class LongNumber{
public:
        int digits;
        char* number;
        LongNumber(const char * source );
        void print();
}

LongNumber::LongNumber(const char * source ){
        digits = strlen(source);
        number = new char[digits+1];
        strcpy( number, source );
        //  cout<<number<<endl; - if the line is uncommented,
        //  the output is correct and there isn't a problem
}

void LongNumber::print(){
    cout<<number<<endl;
    // when I try to print with the same line of code here..it crashes
}

それが役立つことを願っています!!!

于 2009-06-28T07:30:15.767 に答える