我在这里看一些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中读到的内容......
我非常感谢您的澄清!
度过愉快的一天,
答案 0 :(得分: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];
答案 1 :(得分:0)
设计界面的人决定通过将值填入其中来修改const Byte
对象的内容。据推测,他们已经完成了header.get()[i]
可修改所需的任何黑客攻击。我不会将此代码用作良好界面设计的示例。
答案 2 :(得分:0)
header.get()
应该返回char*
,假设它是基地址并且使用[i]
编入索引并且target
中的字符串应对该位置。
char x[100];
char* get() const
{
return x;
}
int调用函数你可以这样做:
get()[i] = target[i];
它会将target
字符串复制到x
,当x
是私有成员到类时,此方法非常有用,并且您要复制{ {1}}。
编辑如果get()是a inline function ,那么在循环中调用get()函数不会影响性能。我的意思是这样的函数应该内联定义。
答案 3 :(得分:0)
查看doc:
struct Bytes {
char* get() const; // works
char*& get() const; // would not work
char* mem_;
};
这段代码完全有效,即使这是不好的做法。该
问题是指针的副本和常量
class是lost
。 C ++中的constness在很大程度上是概念性的而且很容易
休息(通常甚至没有后果)。我抱怨了
实施者。它应该是这样的:
struct Bytes {
char* get(); // works
const char* get() const; // would not work
char* mem_;
};