Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:getter如何返回指向动态分配数组的指针而不直接访问它?_C++_Class_Return Value_Dynamic Memory Allocation_Getter Setter - Fatal编程技术网

C++ C++;:getter如何返回指向动态分配数组的指针而不直接访问它?

C++ C++;:getter如何返回指向动态分配数组的指针而不直接访问它?,c++,class,return-value,dynamic-memory-allocation,getter-setter,C++,Class,Return Value,Dynamic Memory Allocation,Getter Setter,因此,问题是: 如果我有一个类似以下的程序: class Ticket { private: char* concertName; public: Ticket(char* name="Concert"); char* getConcertName(); } int main() { char* test; Ticket t1; test=t1.getConcertName(); test[1]='A'; } Ticket::Tic

因此,问题是:

如果我有一个类似以下的程序:

class Ticket
{
 private: 
    char* concertName;
 public:
    Ticket(char* name="Concert");
    char* getConcertName();
}
int main()
{
   char* test;
   Ticket t1;
   test=t1.getConcertName();
   test[1]='A';     
}
Ticket::Ticket(char* name)
{
   this->concertName=new char[strlen(Concert)+1];
   strcpy(this->concertName,name);
}
Ticket::getConcertName()
{
  return this->concertName;
}
获得者会返回什么?我的直觉是,它返回指向我之前为concertName分配的内存块的第一个元素的指针,因此我可以不使用setter直接从main更改数组的值,就像我在示例中所做的那样

它可以改变它,但是私有区域的概念是在不使用setter或getter的情况下限制从对象外部对其属性的访问


如果我们有一个静态字段,比如:静态无符号int*arrayI;还有一个静态方法,其工作原理类似于从arrayI返回值的getter?

您可以分配一个新的char*,然后返回该地址,这样,如果用户更改了收到的内容,则不会更改类中的私有字段

我想你是在要求常数:

向getter添加const将阻止调用方修改指针对象

#include <cstdio>
class Ticket
{
 private:
    char concertName[sizeof("Concert")];
 public:
    Ticket(const char *name = "Concert");
    const char* getConcertName() const;
};

int main()
{
   const char *test;
   Ticket t1;
   test = t1.getConcertName(); //OK with const
   //test[1]='A'; // would not compile
}
Ticket::Ticket(const char *name)
{
   snprintf(concertName, sizeof(concertName), "%s", name);
}
const char *Ticket::getConcertName() const
{
  return concertName;
}
#包括
班票
{
私人:
char concertName[sizeof(“Concert”)];
公众:
门票(const char*name=“音乐会”);
常量char*getConcertName()常量;
};
int main()
{
常量字符*测试;
票t1;
test=t1.getConcertName();//使用常量确定
//测试[1]=“A”;//无法编译
}
票证::票证(常量字符*名称)
{
snprintf(concertName,sizeof(concertName),“%s”,name);
}
常量字符*票证::getConcertName()常量
{
返回姓名;
}

防止指针引用内存更改的常用方法是使用
const
关键字:

const char* getConcertName() const;
成员函数后的
const
表示它也可以用于对
Ticket
的常量引用

通过此声明,客户端被迫使用
const char*
来接收getter的结果:

const char* test;
Ticket t1;
test=t1.getConcertName();
尝试更改该值将导致相应的编译器错误消息:

test[1]='A'; // <<<<<<<<<<<<<<<<< Compiler error

test[1]=“A”;//你的直觉是错误的。你为什么不试试呢?函数定义签名必须与声明完全匹配。顺便说一句,包括返回类型。请参见您是否考虑过
const char*
?这就是
const
的用途。Return
const char*
。您应该知道。这似乎是内存管理和异常安全的噩梦。我不希望每次我想要获得一个类的成员时都必须管理一个原始指针。任何由答案提出的解决方案都被认为是正确的。另一种选择是,要么海报提供了他/她不信任的解决方案,要么故意发布了错误的解决方案。在这两种情况下,为什么要发帖呢?那么你想让我先拿到博士学位,然后才能在网上论坛发帖?最重要的答案也是强迫用户管理一个常量指针,你怎么看?不,你不需要博士学位。你只需要确信你的答案是正确的。至于你评论的第二部分,虽然我对其他答案的看法与讨论你的答案无关,但我认为公认的答案是正确的。如果您不同意或发现使用
const
指针是有害的,我建议您在回答中留下评论。那么您能否详细说明const指针如何优于原始指针?