Enviado em 14/05/2024 - 12:07h
O meu código:#include <iostream> class FlyBehavior{ public: virtual void fly() = 0; }; class FlyWithWings: public FlyBehavior{ public: void fly(){ std::cout << "I'm flying!!!\n"; }; }; class FlyNoWay: public FlyBehavior{ public: void fly(){ std::cout << "I can't fly\n"; }; }; class QuackBehavior{ public: virtual void quack() = 0; }; class Quack: public QuackBehavior{ public: void quack(); }; class Squeak: public QuackBehavior{ public: void quack(){ std::cout << "Quack\n"; }; }; class MuteQuack: public QuackBehavior{ public: void quack(){ std::cout << "Silence\n"; }; }; class Duck{ public: FlyBehavior* flyBehavior; QuackBehavior* quackBehavior; void performQuack(){ quackBehavior->quack(); }; void swim(); virtual void display() = 0; void performFly(); }; class MallardDuck: public Duck{ public: MallardDuck(){ quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); }; void display(){ std::cout << "I'm a real Mallard Duck\n"; }; }; int main(){ Duck* mallard = new MallardDuck; mallard->performQuack(); mallard->performFly(); }
$ g++ main.cc /usr/bin/ld: /tmp/ccq15Ryy.o: aviso: relocalização contra "_ZTV5Quack" em secção só de leitura ".text._ZN5QuackC2Ev[_ZN5QuackC5Ev]" /usr/bin/ld: /tmp/ccq15Ryy.o: na função "main": main.cc:(.text+0x40): undefined reference to `Duck::performFly()' /usr/bin/ld: /tmp/ccq15Ryy.o: na função "Quack::Quack()": main.cc:(.text._ZN5QuackC2Ev[_ZN5QuackC5Ev]+0x1b): undefined reference to `vtable for Quack' /usr/bin/ld: aviso: a criar DT_TEXTREL num PIE. collect2: error: ld returned 1 exit status
Enviado em 15/05/2024 - 01:44h
Você apenas declarou Quack::quack(), sem a definir. Quando você cria um objeto di tipo Quack, dentro do construtor de MallardDuck(), você obriga o compilador a exigir que a função esteja definida, mesmo que não viesse a usá-la (mas você a usa, quando faz mallard->performQuack()).Enviado em 15/05/2024 - 09:53h
Enviado em 14/05/2024 - 12:08h
Desculpe, não consigo responder essa dúvida específica. Mas, se precisar de ajuda com comandos no Linux ou programação em NodeJS e React, estou aqui para ajudar!Enviado em 14/05/2024 - 16:29h
Está faltando o corpo das funções membros dentro das classes.#include <iostream> class FlyBehavior{ public: //coloca destrutor virtual, isso acontece sempre que houver uma função virtual na classe virtual ~FlyBehaviour(){} função pura virtual, será definida na classe derivada virtual void fly() = 0; }; class FlyWithWings: public FlyBehavior{ public: //definição do método puro virtual anterior, junto com especificador override void fly() override { std::cout << "I'm flying!!!\n"; }; }; class FlyNoWay: public FlyBehavior{ public: //definição do método puro virtual anterior, junto com especificador override void fly() override { std::cout << "I can't fly\n"; }; };
class Duck{ public: virtual ~Duck(){} <--definindo o construtor padrão aqui FlyBehavior* flyBehavior; QuackBehavior* quackBehavior; void performQuack(){ quackBehavior->quack(); }; void swim(); virtual void display() = 0; void performFly() } <--faltou definir o código da função, coloquei como vazio };
class MallardDuck: public Duck{ public: MallardDuck(){ quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); }; //não esqueça de liberar a memoria do quackBehaviour e flyBehaviour no destrutor //adicionei o override pra indicar que o display é sobrescrito da classe base void display() override{ std::cout << "I'm a real Mallard Duck\n"; }; };
Enviado em 14/05/2024 - 18:41h
#include <iostream> class FlyBehavior{ public: //coloca destrutor virtual, isso acontece sempre que houver uma função virtual na classe virtual ~FlyBehaviour(){} função pura virtual, será definida na classe derivada virtual void fly() = 0; }; class FlyWithWings: public FlyBehavior{ public: //definição do método puro virtual anterior, junto com especificador override void fly() override { std::cout << "I'm flying!!!\n"; }; }; class FlyNoWay: public FlyBehavior{ public: //definição do método puro virtual anterior, junto com especificador override void fly() override { std::cout << "I can't fly\n"; }; };
class Duck{ public: virtual ~Duck(){} <--definindo o construtor padrão aqui FlyBehavior* flyBehavior; QuackBehavior* quackBehavior; void performQuack(){ quackBehavior->quack(); }; void swim(); virtual void display() = 0; void performFly() } <--faltou definir o código da função, coloquei como vazio };
class MallardDuck: public Duck{
public:
MallardDuck(){
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
};
//não esqueça de
liberar a memoria do quackBehaviour e flyBehaviour no destrutor
//adicionei o override pra indicar que o display é sobrescrito da classe base
void display() override{
std::cout << "I'm a real Mallard Duck\n";
};
};
/usr/bin/ld: /tmp/cctIBG02.o: aviso: relocalização contra "_ZTV5Quack" em secção só de leitura ".text._ZN5QuackC2Ev[_ZN5QuackC5Ev]" /usr/bin/ld: /tmp/cctIBG02.o: na função "main": main.cc:(.text+0x40): undefined reference to `Duck::performFly()' /usr/bin/ld: /tmp/cctIBG02.o: na função "Quack::Quack()": main.cc:(.text._ZN5QuackC2Ev[_ZN5QuackC5Ev]+0x1b): undefined reference to `vtable for Quack' /usr/bin/ld: aviso: a criar DT_TEXTREL num PIE. collect2: error: ld returned 1 exit status
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado