5

我在这里查看一些 C++ 代码,但不理解某些内容。这无关紧要,但它来自文档附带的 YARP(机器人中间件)教程。

virtual void getHeader(const Bytes& header) 
{
  const char *target = "HUMANITY";
  for (int i=0; i<8 && i<header.length(); i++) 
  {
    header.get()[i] = target[i]; 
  }
}

现在, header 是对 const 的引用,因此不能在此函数中修改。get被它调用,它的原型是char *get() const;. 如何header.get()下标和修改?该程序编译良好。我可能不明白这里发生了什么,但我基于我在 C++ Primer 中读到的内容......

我非常感谢您的澄清!

祝你今天过得愉快,

4

4 回答 4

1
char *get() const;

右手 const 的意思是“这个成员不会改变类中不可变的任何东西”,它尊重这一点 - 它没有改变任何东西。实现大概是这样的:

char *Bytes::get() const
{
    return const_cast<char *>(m_bytes);
}

然而,返回的指针是一个简单的“char*”。这样想:

(header.get())[i] = target[i];
// or
char* p = header.get();
p[i] = target[i];
于 2013-06-01T06:30:57.733 回答
0

看着文档

struct Bytes {
  char* get() const; // works
  char*& get() const; // would not work
  char* mem_;
};

这段代码是完全有效的,即使它是不好的做法。问题是制作了指针的副本并且类的常量是lost. C++ 中的 constness 在很大程度上是概念性的,很容易被打破(通常甚至没有后果)。我会向实施者投诉。它应该如下所示:

struct Bytes {
  char* get(); // works
  const char* get() const; // would not work
  char* mem_;
};
于 2013-05-14T14:29:30.733 回答
0

设计接口的人决定const Byte可以通过将值填充到对象中来修改对象的内容。大概他们已经做了任何他们需要header.get()[i]修改的黑客行为。我不会将此代码用作良好界面设计的范例。

于 2013-05-14T14:24:52.160 回答
0

header.get()应该返回char*,假设它是基地址,并用[i]和字符串索引target到该位置。

@antitrust 给出了很好的观点,返回地址不能被地址内容修改,例如

char x[100];
char* get() const
{
   return x;
}

int 调用函数,你可以这样做:

get()[i] = target[i]; 

它会将target字符串复制到,当是私有成员x到类时,此方法很有用,并且您要复制到.xx

编辑如果 get() 是内联函数,则在循环中调用 get() 函数不会影响性能。我的意思是这样的函数应该内联定义。

于 2013-05-14T14:25:04.300 回答