while (1): study();

[C++]'const char [14]'에서 'char *'(으)로 변환할 수 없습니다. 본문

학습/C, C++

[C++]'const char [14]'에서 'char *'(으)로 변환할 수 없습니다.

전국민실업화 2021. 12. 19. 23:02
728x90

아래 코드를 실행 시 예외가 발생한다.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;

class Person
{
private:
	char* name;
	int age;
public:
	Person(char* myname, int myage)
	{
		int len = strlen(myname) + 1;
		name = new char[len];
		strcpy(name, myname);
		age = myage;
	}
	void ShowPersonInfo() const
	{
		cout << "이름: " << name << endl;
		cout << "나이: " << age << endl;
	}
	~Person()
	{
		delete[] name;
	}
};

int main(void)
{
	Person man1("Lee dong woo", 29);
	Person man2("Jang dong gun", 41);
	man1.ShowPersonInfo();
	man2.ShowPersonInfo();
	return 0;
}

예외 내용은 구체적으로 다음과 같다.

error C2664: 'Person::Person(char *,int)': 인수 1을(를) 'const char [14]'에서 'char *'(으)로 변환할 수 없습니다.
message : 문자열 리터럴로부터의 변환은 const 한정자가 손실됩니다(/Zc:strictStrings 참조).

즉, 객체 생성자 호출 과정에서 문자열을 넘겼는데 이 문자열의 형식은 const char 배열이고, 너는 지금 char 배열로 받으려고 한다는 것이다.

이는 C와 C++의 차이점인데, C++에서는 문자열을 문자 상수의 배열로 받는다.

따라서 생성자의 매개변수의 자료형을 char*가 아닌 const char*로 정의하면 정상적으로 실행 가능하다.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;

class Person
{
private:
	char* name;
	int age;
public:
	Person(const char* myname, int myage)
	{
		int len = strlen(myname) + 1;
		name = new char[len];
		strcpy(name, myname);
		age = myage;
	}
	void ShowPersonInfo() const
	{
		cout << "이름: " << name << endl;
		cout << "나이: " << age << endl;
	}
	~Person()
	{
		delete[] name;
	}
};

int main(void)
{
	Person man1("Lee dong woo", 29);
	Person man2("Jang dong gun", 41);
	man1.ShowPersonInfo();
	man2.ShowPersonInfo();
	return 0;
}
728x90

'학습 > C, C++' 카테고리의 다른 글

error LNK2019 해결법  (0) 2021.12.24
[C++] 복사생성자의 호출 시기  (0) 2021.12.20
[C++] 정보은닉과 캡슐화  (0) 2021.12.19
구조체에 대한 new & delete 연산  (0) 2021.12.19
[C++] call-by-address와 call-by-reference  (0) 2021.12.18
Comments