复数返回值的常量正确性

发布于 2024-08-22 15:53:55 字数 337 浏览 8 评论 0原文

结构体 Foo { 字符 * 数据指针; };

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

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

struct Foo {
char * DataPtr;
};

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

The Foo::DataPtr is a pointer to an internal buffer of the object behing ISomeInterface. Is there a way to make sure that the Foo::DataPtr returned by the const version of ISomeInterface::GetFoo is a const char * ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

初吻给了烟 2024-08-29 15:53:55

你需要一个

struct ConstFoo {
   const char* DataPtr;
};

为此 。 C++ 中的 const 不具有传递性。 (这也是为什么你有iteratorconst_iterator。)

You need a

struct ConstFoo {
   const char* DataPtr;
};

for this. The const in C++ is not transitive. (this is also why you have iterator and const_iterator.)

万劫不复 2024-08-29 15:53:55

结构

struct Foo {  
    char * DataPtr;  
}

与结构不同,

struct Foo {  
    const char * DataPtr;
}

因此您无法区分您想要的方式。

您可以使 const GetFoo() 返回一个 const Foo 对象(我怀疑这不是您想要的,因为它会使所有成员变量都为 const),或者 make另一个带有 const char * DataPtr 的结构(比如 FooConst),它在 const 调用时返回。

A struct

struct Foo {  
    char * DataPtr;  
}

is not the same as

struct Foo {  
    const char * DataPtr;
}

so you cannot differentiate how you would like.

You could make the const GetFoo() return a const Foo object (which I suspect is not what you want, as it will make all the member variables const), or make another struct with a const char * DataPtr (say FooConst) which is returned on the const call.

情话墙 2024-08-29 15:53:55

您可以尝试更改 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 和哪些操作不是 const 的函数,可以避免重复您的 Foo 并获得您似乎想要的 const 正确性限制。

You could try to change the design of your Foo and 'hide' the acess to DataPtr behind functions. For instance:

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();

Providing functions that define which operations are const and those that are not you can avoid duplicating your Foo and obtain the const-correctness restrictions you seem to be aiming for.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文