【解決方法】「const char*」から「int」への無効な変換


C++
#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

C++
Mint b{ std::string{ "1234567" } };

最新のコンパイラを使用している場合は、これを使用する必要があります。

C++
Mint b( std::string( "1234567" ) );

そうでない場合は。

2 番目の問題は、数字をどのように保存するかです。 組み込み配列を使用するよりも良い方法は、 std::vector。 動的にサイズ変更可能で、一度サイズを変更すると、通常は組み込み配列と同じくらい高速になります。

最後の問題は、オブジェクトのコピーと割り当てを処理することです。 次のようなことを行うと何が起こるかを考えてみましょう。

Mint a = 137;<br />
Mint b = a;<br />

うまくいけば、 vector 数字を保存する場合、この問題は自動的に解決しますが、メモリを自分で管理しようとする場合は、考慮する必要があります。

解決策 1

C++
//#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)
{
コート<

コメント

タイトルとURLをコピーしました