mam klasy PlayerInputComponent
:Dlaczego wywołuje to konstruktor kopiowania, a nie konstruktor ruchu?
.h:
class PlayerInputComponent
{
public:
PlayerInputComponent(PlayerMoveComponent& parentMoveComponent_, std::unique_ptr<IRawInputConverter> inputConverter_);
PlayerInputComponent(PlayerInputComponent&& moveFrom);
void update();
private:
std::unique_ptr<IRawInputConverter> inputConverter;
PlayerMoveComponent& parentMoveComponent;
};
}
.cpp:
PlayerInputComponent::PlayerInputComponent(PlayerMoveComponent& parentMoveComponent_, std::unique_ptr<IRawInputConverter> inputConverter_) :
parentMoveComponent(parentMoveComponent_),
inputConverter(std::move(inputConverter_))
{
}
PlayerInputComponent::PlayerInputComponent(PlayerInputComponent&& moveFrom) :
parentMoveComponent(moveFrom.parentMoveComponent),
inputConverter(moveFrom.inputConverter.release())
{
}
i klasy PlayerMoveComponen
t, która zawiera człon PlayerInputComponent
i inicjuje się za pomocą std::unique_ptr
przekazany jako parametr. Jej konstruktor:
PlayerMoveComponent::PlayerMoveComponent(/* other parameters */ std::unique_ptr<IRawInputConverter> inputConverter) :
//other initializations
inputComponent(PlayerInputComponent(*this, std::move(inputConverter)))
{
}
zdefiniowałem własne konstruktora ruch dla klasy PlayerInputComponent
od mojego zrozumienia jest to, że konstruktor domyślny ruch nie zostanie zbudowana dla klasy, która zawiera element odniesienia. W tym przypadku jednak wiem, że odniesienie pozostanie w zakresie czasu trwania obiektu PlayerInputComponent
.
Odkąd jestem inicjowania PlayerMoveComponent
„inputComponent
zmiennej s od tymczasowy, wierzę, jeden z dwóch następujących rzeczy ma się wydarzyć:
PlayerInputComponent
” s ruch konstruktor służy do zainicjowania elementuplayerInputComponent
zmienna.- Ruch jest usuwany przez kompilator.
Jednakże Visual Studio 2012 pluje na to uwagę:
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
1> with
1> [
1> _Ty=SDLGame::IRawInputConverter
1> ]
1> c:\program files\microsoft visual studio 11.0\vc\include\memory(1447) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
1> with
1> [
1> _Ty=SDLGame::IRawInputConverter
1> ]
1> This diagnostic occurred in the compiler generated function 'PlayerInputComponent::PlayerInputComponent(const PlayerInputComponent &)'
Dlaczego konstruktor kopia nazywany jest tutaj? Uczynienie z klasy PlayerInputComponent
klasy parentMoveComponent
zwykłą instancją ParentMoveComponent
, a nie z odniesieniem, pozbywa się błędu, ale nie rozumiem, dlaczego - przetestowałem i zweryfikowałem, że obiekty budujące ruch z elementami referencyjnymi działają tak długo, jak długo dostarczasz własny konstruktor ruchu, więc o co chodzi?
@MooingDuck: Nie widzę odpowiedzi na pytanie. Jestem pewien, że jest to błąd w MSVC. –
@JesseDobra: [masz rację] (http://coliru.stacked-crooked.com/), źle odczytałem część kodu. To jest [Mój raport o błędzie] (https://connect.microsoft.com/VisualStudio/feedback/details/778513/msvc10-using-copy-constructor-zamiast-of-move): P –
* Deklaracje * wyżej wymienionych klas, rozebrane, aby zawierały tylko odtwarzalne wyniki (co nie wydaje się być zbyt trudnym) byłoby miło również zobaczyć, w szczególności 'PlayerMoveComponent' – WhozCraig