Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Utworzenie obiektu tej samej klasy co podany obiekt - problem z klasą dziedziczącą

Ostatnio zmodyfikowano 2014-05-03 20:38
Autor Wiadomość
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:
C/C++
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:
C/C++
auto test = new decltype( obiekt_B );
std::cout << typeid( * test ).name() << std::endl; // wyświetlona jest klasa A

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ć.
P-109208
colorgreen19
» 2014-05-03 20:07:44
nie zapomniałeś '*' między auto a test? ===> 
auto * test
?
P-109209
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.
P-109211
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
P-109212
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.
P-109214
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ć:
C/C++
#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";
    }
}
P-109215
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.
P-109216
« 1 »
  Strona 1 z 1