[英]Storing char array in a class and then returning it
我需要在一個類中存儲一個char數組,然后將其返回。 我必須承認,我對指針有些困惑,並且嘗試了所有我能想到的但無法正常工作的東西。 這是我所擁有的:
#include <iostream>
using namespace std;
class Test {
public:
void setName(char *name);
char getName();
private:
char m_name[30];
};
void Test::setName(char *name) {
strcpy(m_name, name);
}
char Test::getName() {
return *m_name;
}
void main() {
Test foobar;
char name[] = "Testing";
foobar.setName(name);
cout << foobar.getName();
}
當然,我希望setName()將字符串“ Testing”存儲在類內部,並且getName()應該返回“ Testing”。 但是,我只能得到第一個字母T。我在做什么錯?
我想我應該使用std字符串,但首先我想了解為什么這不起作用。 據我所知,這也應該適用於char數組嗎?
只需返回一個指針:
const char* Test::getName() const
{
return m_name;
}
並為class Test
添加一個構造函數,該構造函數將終止封裝的數組:
Test::Test()
{
m_name[0] = 0;
}
這樣,如果有人實例化了class Test
並且沒有在實例上調用setName()
,就不會遇到麻煩。
在Test::getName()
您僅返回一個字符(第一個字符)。 相反,您應該從字符串開始處返回第一個字符的地址,即將返回類型更改為char*
,並將return語句更改為return m_name;
當有指針p
,指針解引用運算符*
“跟隨”該指針,因此表達式*p
計算結果為指針指向的任何對象。
在許多情況下,數組名稱(例如m_name
)的行為類似於指針。 因此, *m_name
值*m_name
數組中的第一個char
,因為當數組名稱被解釋為指針時,它就是指向該數組的類型。
由於C中的字符串表示為指向字符的指針,因此您不應取消引用該指針,而應將其完整返回。
許多人建議您使用strncpy()
將輸入字符串寫入數組,因為它會進行邊界檢查。 但是,這不是最佳選擇,它的語義很奇怪,將字符串復制到有限的緩沖區中實際上不是設計的目的。 最好調查一下您的環境中是否有各種snprintf()
函數,並像這樣使用:
snprintf(m_name, sizeof m_name, "%s", name);
而且在void Test::setName()
使用strncpy()
比strcpy()
更安全。
如果您希望這是C ++,除非您有非常具體的理由,否則不要使用char指針!
從char指針切換到std :: string,看看是否能解決您的問題:
#include <iostream>
#include <string>
using namespace std;
class Test {
public:
void setName(std::string name);
std::string getName();
private:
std::string m_name;
};
void Test::setName(std::string name) {
m_name = name;
}
std::string Test::getName() {
return m_name;
}
void main() {
Test foobar;
foobar.setName("Testing");
cout << foobar.getName();
}
為了獲得加分,請將setName中的參數類型設置為const std :: string&。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.