Const-Correctness на сложное возвращаемое значение - PullRequest
0 голосов
/ 26 февраля 2010

struct Foo { char * DataPtr; };

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

Foo::DataPtr - указатель на внутренний буфер объекта, работающего ISomeInterface. Есть ли способ убедиться, что Foo::DataPtr, возвращенный константной версией ISomeInterface::GetFoo, является const char *?

Ответы [ 3 ]

5 голосов
/ 26 февраля 2010

Вам нужно

struct ConstFoo {
   const char* DataPtr;
};

за это. Const в C ++ не транзитивен. (это также, почему у вас есть iterator и const_iterator.)

1 голос
/ 26 февраля 2010

структура

struct Foo {  
    char * DataPtr;  
}

не совпадает с

struct Foo {  
    const char * DataPtr;
}

так что вы не можете различить, как вы хотели бы.

Вы можете заставить const GetFoo() возвращать объект const Foo (что, я подозреваю, не то, что вам нужно, так как это сделает все переменные-члены const), или создать другую структуру с const char * DataPtr (скажем FooConst), который возвращается при вызове const.

0 голосов
/ 26 февраля 2010

Вы можете попытаться изменить дизайн вашего 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();

Предоставляя функции, которые определяют, какие операции являются константными, а какие нет, вы можете избежать дублирования вашего Foo и получить ограничения на корректность констант, к которым вы, похоже, стремитесь.

...