Pergunta

Em outras palavras, dado um shape classe base e uma classe derivada rectangle:

class shape
{
public:
  enum shapeType {LINE, RECTANGLE};
  shape(shapeType type);
  shape(const shape &shp);
}

class rectangle : public shape
{
public:
  rectangle();
  rectangle(const rectangle &rec);
}

Eu gostaria de saber se eu poderia criar uma instância de rectangle chamando:

shape *pRectangle = new shape(RECTANGLE);

e como eu poderia implementar o construtor de cópia, a fim de obter um novo rectangle chamando:

shape *pNewRectangle = new shape(pRectangle);
Foi útil?

Solução

Resposta curta: Não

Long Resposta:

Você precisa de um objeto de fábrica / método.
Você pode adicionar um método de fábrica estático para a classe base do cria o tipo de objeto apropriado.

class Shape
{
    static Shape* createShape(shapeType type)
    {
        switch (type)
        {
             case RECTANGLE:return new rectangle();
           ...
        }
    }
 }; 

A preferência pessoal:

Eu iria com uma classe completamente diferente de ser a fábrica em vez de usar um método estático na classe base. A razão para isso é que cada vez que você criar uma nova classe moldar o estilo forças acima de você para re-construir a classe Shape cada vez.

Assim, gostaria de separador para fora da fábrica em uma classe ShapeFactory.

Outras dicas

Você não pode fazer isso diretamente de dentro do construtor. Em vez disso, você vai precisar usar uma outra abordagem, como um Fábrica método .

O problema é que, quando você faz nova forma (...), você sempre vai retornar uma instância de forma - não retângulo. Se você quer um "retângulo", em algum momento, ele vai precisar ligar para novo retângulo (..). Um método poderia lidar com essa lógica para você, mas não a construção padrão em C ++.

Chamar um construtor sempre lhe dará um objeto do tipo do construtor.

new shape(...)

Eu acho que você quiser usar o padrão de design de fábrica em vez disso, onde há um método estático na forma que pode criar qualquer subtipo, se necessário.

shape *pRectangle = new shape(RECTANGLE);

Não há nenhuma maneira para que você crie uma classe derivada através da construção de um objeto base. Você tem que fazer um novo da própria classe derivada.

Em C ++ você pode usar fundição dinâmica para alcançar este objetivo, mas erm, não, não de dentro do construtor. Use-o como indicado acima em um método de fábrica

http://www.cprogramming.com/reference/typecasting/dynamiccast .html

Você pode fazer algo parecido com design Policy-Based. Seu código seria algo como

shape* pRectangle = new derrivedType<rectangle>();

Projeto Policy-Based

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top