[ad_1]
#include <iostream> #include <string> using namespace std; class Mint { public: Mint(); Mint(int); Mint (string s); private: int num[]; }; Mint::Mint() { num[0] = 0; } Mint::Mint(int n) { int i=0; while(n>0) { num[i] = n%10; n = n/10; i++; } } Mint::Mint(string s) { int i = 0 ; while(s[i] != '\0') { i++; } i--; while(i>=0){ num[i] = s[i] - '0'; i--; } } int main() { Mint x; Mint y; Mint z=50014; Mint a="065272005572"; //its important that i initialize this way }
コンパイルしようとするとエラーが発生します
「const char*」から「int」への無効な変換 Mint a=”065272005572″
と
「Mint::Mint(int)」の引数 1 を初期化しています [-fpermissive]
ミント(int);
助けてください。
解決策 2
あなたのコードには差し迫った問題が 3 つあります。
1 つ目 (そしてコンパイラーが問題を抱えている問題) は、どのコンストラクターを呼び出す必要があるかを判断できないことです。 与えると int
最初に呼び出すことができます。 ただし、それを与えると、 const char *
あなたがそれを望んでいるという考えはありません string
コンストラクターが呼び出されます。 したがって、文字列コンストラクターを実際に呼び出したい場合は、それを与えます string
!
Mint b{ std::string{ "1234567" } };
最新のコンパイラを使用している場合は、これを使用する必要があります。
Mint b( std::string( "1234567" ) );
そうでない場合は。
2 番目の問題は、数字をどのように保存するかです。 組み込み配列を使用するよりも良い方法は、 std::vector
。 動的にサイズ変更可能で、一度サイズを変更すると、通常は組み込み配列と同じくらい高速になります。
最後の問題は、オブジェクトのコピーと割り当てを処理することです。 次のようなことを行うと何が起こるかを考えてみましょう。
Mint a = 137;<br />
Mint b = a;<br />
うまくいけば、 vector
数字を保存する場合、この問題は自動的に解決しますが、メモリを自分で管理しようとする場合は、考慮する必要があります。
解決策 1
//#include <iostream> //#include <string> //using namespace std; class Mint { public: Mint(); Mint(int); Mint (const char*); ~Mint(); private: int* m_num; }; Mint::Mint() : m_num(NULL) { } Mint::~Mint() { delete[] m_num; } Mint::Mint(int n) { m_num = new int[n]; int i=0; while(n>0) { m_num[i++] = n%10; n = n/10; } } Mint::Mint(const char* str) { int i = 0 ; while(str[i] != '\0') { ++i; } m_num = new int[i]; --i; while(i>=0){ m_num[i] = str[i] - '0'; --i; } }
解決策 3
#include
名前空間 std を使用します。
int main()
{
int a;
cout <<"息子キリット:";
シン>>a;
if(a>0)
{
コート<
[ad_2]
コメント