从 char[256] 属性的访问器返回 char[256]

时间:2021-05-30 16:48:17

标签: c++ accessor

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 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),但我不明白......

你能帮我吗?谢谢!

2 个答案:

答案 0 :(得分:0)

这个构造函数的声明

A(char i[256]);

没有多大意义,因为编译器会像

一样调整参数声明
A(char *i);

考虑到这个代码片段

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();

答案 1 :(得分:0)

问题是,您的构造函数没有正确初始化 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;
}