说我有以下代码:
Frame process(Frame input) {
if (rareEvent) {
input = new Frame();
}
input.bytes[0] = 255;
return input;
}
//Elsewhere...
Frame example = new Frame();
example.bytes[0] = 127;
example = process(example);
Run Code Online (Sandbox Code Playgroud)
显然,在极少数情况下input重新创建Frame对象时,它将不是完全相同的对象.但是,最终目标是,在正常情况下(rareEvent寄存器为false),Frame的bytes属性永远不会被完全复制.这是因为,在实际场景中,在非常时间敏感的操作中,它将是数百万字节长.
在这种特殊情况下,我并不太关心对象的其余部分是否真正相同,只是它的属性.但是,为了完成,我也可以查询两个:如果返回作为参数传递的对象,它是否完全相同(==)对象?在我的特定情况下,对象的属性是否会避免任何昂贵的复制?
不知道怎么做,但我会从代码片段和输出开始:
uint32_t expires;
cout << "Expiration bytes: " << setfill('0') << hex
<< setw(2) << (unsigned short)rec[keyLen+4]
<< setw(2) << (unsigned short)rec[keyLen+5]
<< setw(2) << (unsigned short)rec[keyLen+6]
<< setw(2) << (unsigned short)rec[keyLen+7] << endl;
expires = ntohl(*(uint32_t*)&rec[keyLen+4]);
cout << "Expiration: " << (long)expires << endl;
cout << "Hex: " << hex << expires << endl;
Run Code Online (Sandbox Code Playgroud)
输出:
Expiration bytes: 00000258
Expiration: 258
Hex: 258
Run Code Online (Sandbox Code Playgroud)
我可以从程序的其他部分确认检查和输出字节的十六进制表示按预期工作,并且那些确实是字节流中的字节(从另一个应用程序发送).
现在,如果expiration只是举行一些废话,我将能够更好地理解,因为这意味着存在一些令人震惊的错误(可能涉及指针).但是......这显然只是将十六进制值吐出来,好像它是一个小数,这是完全错误的.
更令人困惑的是,这在程序的另一个方面起作用:
fullSize = ntohs(*(uint16_t*)&buff[0]);
Run Code Online (Sandbox Code Playgroud)
字节值为0x0114时,fullSize将包含值276.
所以问题是,这里到底发生了什么?int怎么可能出错?
我有一个设计为通用的类,在任何地方使用,看起来有点像这样:
class FixedByteStream {
public:
FixedByteStream(const char* source)
{
size = strlen(source);
copy(source);
}
/* Many more constructors here */
protected:
void copy(const char* source)
{
address = allocate();
//...
}
/* Plus other functions that call allocate() */
char* FixedByteStream::allocate()
{
return (char*)malloc(size);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我扩展了这个类,以便它可以使用特定于项目的内存池.
class PooledByteStream : public FixedByteStream {
public:
PooledByteStream::PooledByteStream() : FixedByteStream() {}
protected:
char* PooledByteStream::allocate()
{
return (char*)PooledByteStream::pool.allocate(size);
}
}
Run Code Online (Sandbox Code Playgroud)
PooledByteStream应该与 FixedByteStream 相同,具有所有相同的函数和构造函数,除了调用allocate()时,它应该从内存池中检索指针.
但是,从未调用过 PooledByteStream :: allocate().不是来自继承的构造函数,也不来自其他继承的函数(调用继承的copy()).从基类继承的任何东西都完全没有注意到allocate()应该做一些完全不同的事情.
问题是,我该如何解决这个问题?如何使继承函数调用重写函数,而不是基类函数?从基类复制粘贴所有必要的函数会抹掉继承点,所以我假设这不是答案.
注意: …
我试图从PHP移植一些代码,基本归结为属性重载.也就是说,如果你试图获取或设置一个实际上没有被定义为类的一部分的类属性,它会将该信息发送给一个几乎可以用它做任何事情的函数.(在这种情况下,我想在放弃之前在类中搜索关联数组.)
但是,Perl与PHP有很大的不同,因为类已经是哈希.有没有什么方法可以将一些等效的__get()和应用__set()到Perl"类"中,它仍将完全封装在该包中,对于试图实际获取或设置属性的任何内容都是透明的?
编辑:解释这个的最好方法可能是向您显示代码,显示输出,然后显示我想要输出的内容.
package AccessTest;
my $test = new Sammich; #"improper" style, don't care, not part of the question.
say 'bacon is: ' . $test->{'bacon'};
say 'cheese is: ' . $test->{'cheese'};
for (keys $test->{'moreProperties'}) {
say "$_ => " . $test->{'moreProperties'}{$_};
}
say 'invalid is: ' . $test->{'invalid'};
say 'Setting invalid.';
$test->{'invalid'} = 'true';
say 'invalid is now: ' . $test->{'invalid'};
for (keys $test->{'moreProperties'}) {
say "$_ => " …Run Code Online (Sandbox Code Playgroud) c++ ×2
byte ×1
constructor ×1
hex ×1
inheritance ×1
java ×1
oop ×1
overloading ×1
performance ×1
perl ×1
posix ×1
reference ×1