0

クラスがありFooます。Fooconst 以外のメソッドがいくつかあります。Foo一時オブジェクトで const 以外のメソッドを呼び出しても問題ありません。Fooメソッドがオブジェクト自体に何をするかよりも、メソッドが実際に返すものだけに興味があります。

最初の質問: これだけで、クラスFooが適切に設計されていないことを示す必要がありますか?

2 番目の質問: そのまま続行したいが、非 const メソッドを呼び出す関数への参照によってオブジェクトFooを渡すことができるようにしたい場合、それを行うための最良の方法は何でしょうか?Foo

これは私が到着したものです:

// The function that performs work on a Foo object.
int TakeFoo (Foo& FooBar) { ... }

// An overload just to accept temporary Foo objects.
int TakeFoo (Foo&& FooBar)
{
    // Delegate
    return TakeFoo(FooBar);
}

別のアプローチは、これを行うだけです:

int TakeFoo (const Foo& FooBar)
{
    Foo& MyFooBar = const_cast<Foo&>(FooBar);
    // Do work on MyFooBar
}

しかし、このアプローチには、実際に const と宣言されたオブジェクトの const を const-cast'ing している可能性があるという問題があり、未定義の動作の土地に陥る可能性があります。

編集:

TakeFoo を使用するコード例:

Foo GimmeFoo() { ... }

cout << TakeFoo(GimmeFoo()) << endl;

Foo ConstructedFoo(...);

cout << TakeFoo(ConstructedFoo) << endl;

// Continue to use ConstructedFoo
4

1 に答える 1

0

2 番目の質問への回答:

関数 TakeFoo が Foo の非 const メンバーを呼び出すことを意図している場合は、使用します

int TakeFoo (Foo& FooBar);

TakeFoo が右辺値のみを引数として取ることが確実な場合は、次を使用します

int TakeFoo (Foo&& FooBar);

int戻り値を計算するために Foo に変更を加えたい場合は、次を使用します

int TakeFoo (const Foo& FooBar)
{
    Foo FooBar MyFooBar = FooBar;
    // do something with MyFooBar and return int
}

または

int TakeFoo (Foo FooBar);

最初の質問への回答:

int TakeFoo (FooBar)結果を計算するために FooBar を変更しないでくださいint。より良いデザインは

Foo transform_foo(Foo const& foo);
int compute_result(Foo const& foo);
int TakeFoo(Foo const& FooBar)
{
    return compute_result( transform_foo(FooBar) );
}
于 2013-06-20T00:00:08.053 に答える