簡體   English   中英

將char數組存儲在類中,然后返回

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM