我正在嘗試運行以下代碼,取自 Balagurusamy(第 8 版)的“C 面向物件編程”:
#include <iostream>
#include <cstring>
using namespace std;
class String
{
char *name;
int length;
public:
String()
{
length = 0;
name = new char[length 1];
}
String(char *s)
{
length = strlen(s);
name = new char[length 1];
strcpy(name,s);
}
void display(void)
{cout<<name<<"\n";}
void join(String &a, String &b);
};
void String :: join(String &a, String &b)
{
length = a.length b.length;
delete name;
name = new char[length 1];
strcpy(name, a.name);
strcat(name, b.name);
};
int main()
{
char *first = "Joseph ";
String name1(first), name2("Louis"), name3("Lagrange"), s1,s2;
s1.join(name1, name2);
s2.join(s1,name3);
name1.display();
name2.display();
name3.display();
s1.display();
s2.display();
return 0;
}
當我用 g 編譯時,我遇到了以下日志:
g -Wall -Werror -Wextra constructors_with_new.cpp -o constructors_with_new.o
constructors_with_new.cpp: In function ‘int main()’:
constructors_with_new.cpp:45:15: error: ISO C forbids converting a string constant to ‘char*’ [-Werror=write-strings]
45 | char *first = "Joseph ";
| ^~~~~~~~~
constructors_with_new.cpp:47:28: error: ISO C forbids converting a string constant to ‘char*’ [-Werror=write-strings]
47 | String name1(first), name2("Louis"), name3("Lagrange"), s1,s2;
| ^~~~~~~
constructors_with_new.cpp:47:44: error: ISO C forbids converting a string constant to ‘char*’ [-Werror=write-strings]
47 | String name1(first), name2("Louis"), name3("Lagrange"), s1,s2;
| ^~~~~~~~~~
cc1plus: all warnings being treated as errors
然后我找到了以下答案
為什么從字串常量到'char *'的轉換在C中有效但在C 中無效
為了讓它作業,我修改了上面的代碼
const在第二個建構式 (String(char const *s))中接收指向 char 的指標- 在內部
main(),通過將名字“約瑟夫”的初始化從char * first更改為char const * first,正如 Jeremy Coffin 在對提供的鏈接的回答中所建議的那樣
這樣,它編譯沒有問題,輸出如下
Joseph
Louis
Lagrange
Joseph Louis
Joseph Louis Lagrange
我想知道這是否是解決此問題的最佳方法,或者您是否推薦了另一種方法(可能是另一種不需要輸入指向 a 的指標的const方法char)。
最好的,
斯特凡諾
uj5u.com熱心網友回復:
正如評論所示,您需要使用const char*,而不是char*。看來這本書已經過時了。
在 C 中,字串文字的型別為const char[N],其中N是文字中的字符數加上終止符的 1 '\0'。
通過進行以下更改,我能夠使您的代碼編譯和運行:
String將from的建構式更改
String(char *s)
為
String(const char *s)first將from的宣告更改
char *first = "Joseph ";
為
const char *first = "Joseph ";- 去掉末尾多余的分號
String::join。
此外,通過適當的縮進,代碼會更加清晰。
uj5u.com熱心網友回復:
C 中的字串文字默認為 const char*。這就是為什么您在嘗試將 const char* 分配給 char* 時看到這些警告的原因。
您可以通過丟棄 char* 的 constness 來簡單地洗掉這些警告。您可以通過使用來實作這一點const_cast<char*>
例如:
char *first = const_cast<char*>("Joseph ");
String name1(first), name2(const_cast<char*>("Louis")), name3(const_cast<char*>("Lagrange")), s1,s2;
這應該會洗掉您的警告。
編輯:這不是最好的建議。我的回答只是為了解釋你如何可以拋棄字串文字的 const-ness 而絕不促進它。字串文字的常量存在是有原因的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/463582.html
