复杂回报值的正确性

时间:2010-02-26 10:33:42

标签: c++ const-correctness

struct Foo {         char * DataPtr;     };

class ISomeInterface {
public:
    Foo GetFoo( ) const;
    Foo GetFoo( );
};

Foo::DataPtr是指向对象behing ISomeInterface的内部缓冲区的指针。有没有办法确保Foo::DataPtr的const版本返回的ISomeInterface::GetFooconst char *

3 个答案:

答案 0 :(得分:5)

你需要一个

struct ConstFoo {
   const char* DataPtr;
};

为此。 C ++中的const不是传递性的。 (这也是iteratorconst_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限制。