2017-12-16 11 views
-2

私はパラメータchar*(数字のみ)を持つコンストラクタを持っており、簡単な数学演算をしたいと思います。私は簡単にするために、コンストラクタint[]/int*に新しいパラメータを追加することを考えました。C++のコンストラクタchar *からint []/int *

ヘッダー:

class BigNum { 
    char *value; 
    int* arr; 

    public: 
     BigNum(char*, int * = 0) {}; 
     BigNum(); 
}; 

CPP:

BigNum::BigNum(char* value, int *tab){ 
    int length = sizeof(value)/sizeof(char*); 
    for (int i = 0; i < length; i++) { 
     arr[i] = value[i]; 
    } 
} 

私はこのような何かを行うことができますか?それはコンパイルされません。 このサンプルでの変更点は、char*intです。

+0

なぜヌルcharecterまでの長さの一見のために、あなたは、いくつかを持っていませんタブが値と同じ長さでない場合の未定義の動作 –

+0

Int *何があるはずですか? – DiCri

+0

スタックオーバーフローへようこそ。質問を投稿する前にヘルプセクションをお読みください。あなたの質問は恐ろしい最初の質問ではありませんが、私はあなたが達成しようとしていることを理解していません。あなたは質問の冒頭にその例を追加してください。 –

答えて

1

そのも、あなたは二回BigNum(char*, int *)を定義したので、それがコンパイルされません

をコンパイルしません。一度ヘッダーに入り、次にソースファイルに入ります。

解決策:コンストラクタを1回だけ定義してください。追加のヒント:プログラムがコンパイルされないとき、コンパイラは診断メッセージでなぜそのことを伝えます。


これは、あなたがそれがないと思う何をしていません。valueのタイプはchar*あるので

int length = sizeof(value)/sizeof(char*); 

lengthは常に、1になります。私は、あなたの意図がvalueが配列を指していると思うし、その配列の長さを計算したいと思う。まあ、ポインタからその配列の要素までの配列の長さを計算することはできません。

解決方法:a)配列の長さを引数として渡すか、b)配列を終了文字列にする必要があります。この場合、終了文字が終わるまで文字列を繰り返して長さを計算できます見つかりました。


あなたはarrを初期化せずにarr[i]にアクセス:

arr[i] = value[i]; 

動作は未定義です。

解決方法:アレイを割り当てる必要があります。


intに、このサンプルの変更のchar *上に何をすべきか私ができます。

どのように変更したいかによって異なります。先読みされた文字桁をintに変換する場合は、(C++でサポートされている)すべてのネイティブ文字エンコードで数字を逐次にする必要があるという事実を利用できます。その事実から、我々は数字の文字が表す0文字の値から数字の文字の値を減算する、我々は数値を取得することを知っている:

char* c = address_of_some_digit; 
int value_of_digit = '0' - *c; 
関連する問題