struct Foo { char * DataPtr; };
class ISomeInterface {
public:
Foo GetFoo( ) const;
Foo GetFoo( );
};
Foo::DataPtr
是指向对象behing ISomeInterface
的内部缓冲区的指针。有没有办法确保Foo::DataPtr
的const版本返回的ISomeInterface::GetFoo
是const char *
?
答案 0 :(得分:5)
你需要一个
struct ConstFoo {
const char* DataPtr;
};
为此。 C ++中的const不是传递性的。 (这也是iterator
和const_iterator
的原因。)
答案 1 :(得分:1)
结构
struct Foo {
char * DataPtr;
}
与
不同struct Foo {
const char * DataPtr;
}
所以你无法区分你想要的方式。
你可以使const GetFoo()
返回一个const Foo
对象(我怀疑它不是你想要的,因为它会使所有成员变量成为const),或者使用{ {1}}(比如const char * DataPtr
)在const调用中返回。
答案 2 :(得分:0)
您可以尝试更改Foo
的设计并将“隐藏”功能隐藏到DataPtr
后面。例如:
class Foo {
char * DataPtr;
public:
//just some examples
void doThis() const {}
void doThat() {}
};
class ISomeInterface {
public:
const Foo GetFoo( ) const { return Foo(); }
Foo GetFoo( ) { return Foo(); }
};
...
const Foo foo1 = ISomeInterface().GetFoo();
foo1.doThis();
foo1.doThat(); //error
Foo foo2 = ISomeInterface().GetFoo();
foo2.doThis();
foo2.doThat();
提供定义哪些操作是const的函数和不是哪些操作的函数可以避免重复Foo
并获得您似乎瞄准的const-correctness限制。