【问题标题】:Return char[256] from an accessor of a char[256] attribute从 char[256] 属性的访问器返回 char[256]
【发布时间】:2021-05-30 16:48:17
【问题描述】:
class A{
        char info[256];
        public:
        char* getInfo();
        A(char i[256]);

//A.cpp
#include "A.h"
char * A::getInfo(){
    return(&info[256]);
}
A::A(char i[256]){
    info[256]=i[256];
}

我正在为访问器而苦苦挣扎。当我尝试使用 getInfo() 时,我得到一个 char*,因此与

char test[256] = "test";
FractionException d(test);
for (int i = 0; i < 256; i++) {
    cout << d.getInfo()[i] ;
}

我明白了

╠╠╠╠╠╠╠╠test

我想我做错了,但我想不通..

顺便说一句,VScode 也会警告我

info[256]=i[256]

告诉我可能会写入 257 个八位字节 (C6386) 但我不明白...

你能帮帮我吗?谢谢!

【问题讨论】:

  • 此外,您不能从 C 或 C++ 中的函数返回数组。这种方式行不通。在 C++ 中使用 std::array 而不是普通数组,您将能够从函数中返回它。而且你仍然需要修复损坏的构造函数。
  • 你应该有一个没有参数的默认构造函数。
  • 您应该通过引用传递数组,以便编译器在传递给函数时不会进行复制。
  • @SamVarshavchik 显示的访问器没有任何问题。它不是返回一个数组,而是返回一个指向数组第一个元素的指针,这是完全合法的。
  • @ThomasMatthews 数组不能按值传递,因此不会进行复制。在这段代码中,数组通过隐式指针传递给构造函数。

标签: c++ accessor


【解决方案1】:

问题是,您的构造函数没有正确初始化 info 数组的内容,并且您的访问器返回了错误的指针。

在构造函数中,info[256]=i[256] 并没有按照你的想法去做。您正在尝试将 i 的第 257 个元素复制到 info 的第 257 个元素中,这是未定义的行为,因为两个数组都没有 257 个元素。这就是编译器警告你的原因。

试试这个:

A::A(char i[256]){
    for(int x = 0; x < 256; ++x){
        info[x] = i[x];
   }
}

或者:

#include <algorithm>

A::A(char i[256]){
    std::copy_n(i, 256, info);
}

对于访问器,它返回一个指向不存在的第 257 个元素的指针。您需要返回一个指向第一个元素的指针:

char * A::getInfo(){
    return(&info[0]);
}

或者简单地说:

char * A::getInfo(){
    return info;
}

【讨论】:

    【解决方案2】:

    构造函数的这个声明

    A(char i[256]);
    

    意义不大,因为编译器会像这样调整参数声明

    A(char *i);
    

    考虑到这段代码sn-p

    char test[256] = "test";
    FractionException d(test);
    for (int i = 0; i < 256; i++) {
        cout << d.getInfo()[i] ;
    }
    

    您似乎希望构造函数接受一个字符串。如果是这样,那么它应该被声明为

    A( const char * );
    

    可以这样定义

    #include <cstring>
    
    //...
    
    A::A( const char *i ){
        strncpy( info, i, sizeof( info ) );
        info[sizeof( info ) - 1] = '\0';
    }
    

    成员函数getInfo应该返回数组而不是不存在的元素info[256]的地址

    char * A::getInfo(){
        return info;
    }
    

    这个方法也要重载

    const char * getInfo() const;
    

    还有这个循环

    for (int i = 0; i < 256; i++) {
        cout << d.getInfo()[i] ;
    }
    

    应该代替这个陈述

    std::cout << d.getInfo();
    

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 1970-01-01
      • 2014-05-10
      • 2011-03-10
      • 2014-02-27
      • 1970-01-01
      • 2021-04-01
      • 2019-09-10
      • 2014-12-10
      相关资源
      最近更新 更多