【问题标题】:Storing char array in a class and then returning it将 char 数组存储在一个类中,然后返回它
【发布时间】:2010-12-11 03:44:32
【问题描述】:

我需要在一个类中存储一个 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。我做错了什么?

我想我应该使用标准字符串,但首先我想了解为什么这不起作用。据我所知,这也应该适用于 char 数组?

【问题讨论】:

  • 您是否注意编译器警告? :(

标签: c++ arrays class char return


【解决方案1】:

只返回一个指针:

const char* Test::getName() const
{
    return m_name;
}

并为 class Test 添加一个构造函数,它将以空值终止封装的数组:

Test::Test()
{
    m_name[0] = 0;
}

这样如果有人实例化 class Test 并且没有在实例上调用 setName(),您就不会自找麻烦。

【讨论】:

  • 我还建议使用 strncpy() 而不是 strcpy(),因为这是 C++,你应该使用 std::string 而不是 char 指针,这是 C 的保留跨度>
  • +1 关于std::string 的使用。如果由于某种原因必须使用 C 字符串,可以使用 std::string 的成员函数 c_str() 返回 C 字符串。
【解决方案2】:

Test::getName() 中,您只返回一个字符(第一个字符)。相反,您应该返回字符串开始的第一个字符的地址,即将返回类型更改为char*,将返回语句更改为return m_name;

【讨论】:

    【解决方案3】:

    而且在void Test::setName() 中使用strncpy() 比使用strcpy() 更安全

    【讨论】:

      【解决方案4】:

      当您有一个指针 p 时,指针解引用运算符 * “跟随”指针,因此表达式 *p 的计算结果是指针指向的任何对象。

      在许多情况下,m_name 等数组的名称可以表现得像一个指针。因此,*m_name 计算为数组中的第一个 char,因为这是数组名称在解释为指针时指向的类型。

      由于 C 中的字符串表示为指向字符的指针,因此不应取消引用指针,而应将其原封不动地返回。

      许多人建议您使用strncpy() 将输入字符串写入您的数组,因为它会进行(某种程度的)边界检查。但是,它不是最优的,它的语义很奇怪,将字符串复制到有限的缓冲区中确实不是它的设计目的。最好调查一下您的环境中是否有各种 snprintf() 函数,然后像这样使用它:

      snprintf(m_name, sizeof m_name, "%s", name);
      

      【讨论】:

        【解决方案5】:

        如果您希望这是 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&。

        【讨论】:

          猜你喜欢
          • 2021-06-14
          • 2019-03-15
          • 2012-06-08
          • 2019-08-26
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          • 1970-01-01
          • 2022-01-21
          相关资源
          最近更新 更多