簡體   English   中英

復雜返回值的常量校正

[英]Const-Correctness on complex return value

struct Foo {char * DataPtr; };

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

Foo::DataPtr是指向ISomeInterface對象的內部緩沖區的指針。 有沒有辦法確保ISomeInterface::GetFoo的const版本返回的Foo::DataPtrconst char *

你需要一個

struct ConstFoo {
   const char* DataPtr;
};

為了這。 C ++中的const不是可傳遞的。 (這也是為什么要使用iteratorconst_iterator 。)

一個結構

struct Foo {  
    char * DataPtr;  
}

與...不同

struct Foo {  
    const char * DataPtr;
}

因此您無法區分自己的意願。

您可以使const GetFoo()返回const Foo對象(我懷疑這不是您想要的對象,因為它將使所有成員變量const),或者使用const char * DataPtr (例如FooConst )創建另一個結構,即在const調用上返回。

您可以嘗試更改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正確性限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM