Utworzenie obiektu tej samej klasy co podany obiekt - problem z klasą dziedziczącą
Ostatnio zmodyfikowano 2014-05-03 20:38
Chlorek Temat założony przez niniejszego użytkownika |
Utworzenie obiektu tej samej klasy co podany obiekt - problem z klasą dziedziczącą » 2014-05-03 19:59:29 Przyjmijmy, że mam następujący kod: class A { public: A(); virtual ~A(); }
class B : public A { public: B(); ~B(); }
Tak więc mamy klasy A i B gdzie B dziedziczy po A. Następnie gdzieś w moim programie następuje utworzenie wskaźnika do obiektu klasy B. Nieco później chcę utworzyć inny obiekt TEJ SAMEJ klasy co wcześniej utworzony obiekt (klasy B). I tu napotykam właśnie problem, gdyż ten kod powoduje utworzenie obiektu klasy A: auto test = new decltype( obiekt_B ); std::cout << typeid( * test ).name() << std::endl;
Próbowałem zrobić decltype(*obiekt_B), ale kończy się to błędem: error: new cannot be applied to a reference type Pierwszy raz podchodzę do tego typu zagadnienia (nie korzystam zbyt wiele z programowania uogólnionego i np. decltype to była dla mnie do niedawna magia ;p ) i nie mam pojęcia co dalej zrobić. |
|
colorgreen19 |
» 2014-05-03 20:07:44 nie zapomniałeś '*' między auto a test? ===> auto * test ? |
|
Chlorek Temat założony przez niniejszego użytkownika |
» 2014-05-03 20:14:15 Nie wydaje mi się. auto automatycznie dobiera typ - bez względu czy jest to wskaźnik, czy cokolwiek innego. Jeśli się mylę odeślij mnie do czegoś co mi to wyjaśni. W każdym razie to nic nie zmienia. |
|
Raptiler |
» 2014-05-03 20:22:05 Nie wiem czy dobrze Cię rozumiem ale jeśli tak to obejrzyj do 15 minuty https://www.youtube.com/watch?v=OQ6l8LVlCw4
|
|
Chlorek Temat założony przez niniejszego użytkownika |
» 2014-05-03 20:29:25 Nie oglądałem całych 15 minut, ale patrzyłem na kod, który tam się pojawia i nie widzę powiązania. Mój problem skupia się na decltype i klasie dziedziczącej. |
|
Elaine |
» 2014-05-03 20:32:51 Nieco później chcę utworzyć inny obiekt TEJ SAMEJ klasy co wcześniej utworzony obiekt (klasy B). |
decltype tutaj nic nie da, bo interesuje się tylko statycznym typem wyrażenia. Jeśli chcesz dostać obiekt o tym samym typie dynamicznym, to klasa powinna sama wiedzieć, jak się sklonować:
#include <memory> #include <iostream>
class A { public: int foo = 5; virtual ~A() = default; std::unique_ptr < A > clone() const { return std::unique_ptr < A > { clone_impl() }; } private: virtual A * clone_impl() const { return new A { * this }; } };
class B : public A { public: int bar = 10; private: virtual B * clone_impl() const override { return new B { * this }; } };
int main() { const auto b = std::unique_ptr < A > { std::make_unique < B >() }; const auto clone = b->clone(); if( dynamic_cast < B *>( clone.get() ) != nullptr ) { std::cout << "ok\n"; } } |
|
Chlorek Temat założony przez niniejszego użytkownika |
» 2014-05-03 20:38:07 @Alueril Wielkie dzięki, zarówno za wyjaśnienie jak i przykładowy kod. Właściwie to sam prawie do tego dotarłem czytając, że decltype określa typ w czasie kompilacji, więc na logikę nie ma możliwości wykrycia typu takiego obiektu. Jeszcze raz wielkie dzięki ;) Zamykam temat. |
|
« 1 » |