c++ – Uso do delete em um ponteiro de uma classe abstrata

Lendo o livro A tour of C++, numa seção sobre vazamento de memória, quando me deparei com 3 afirmações em relação ao código abaixo:

  1. A implementação de Smiley pode falhar ao deletar o ponteiro para mouth.
  2. A user of read_shape() pode falhar ao deletar o ponteiro retornado.
  3. Uma variável do tipo Shape* pode falhar ao tentar deletar o objeto para que aponta.

Texto original:

Experienced programmers will have noticed that I left open three opportunities for mistakes:
• The implementer of Smiley may fail to delete the pointer to mouth.
• A user of read_shape() might fail to delete the pointer returned.
• The owner of a container of Shape pointers might fail to delete the objects pointed to.

O CÓDIGO ABAIXO NÃO COMPILA, É APENAS UMA REPRESENTAÇÃO DO LIVRO PARA ENTENDER O PROBLEMA.

class Shape
{
    public:
        virtual ~Shape() {}
};

class Circle : public Shape
{
    public:
        Circle(Point _center, int _rad) : center { _center }, rad { _rad }
        {}

    private:
        Point center;
        int rad;
};

class Smiley : public Circle
{
    public:
        Smiley(Point center, int rad) : Circle { center, rad }, mouth { nullptr }
        {}

        ~Smiley()
        {
            delete mouth; // Referencia da primeira afirmação.
            for (auto eye : eyes)
                delete eye;
        }

        void set_mouth(Shape* _mouth)
        {
            mouth = _mouth;
        }

    private:
        std::vector<Shape*> eyes;
        Shape* mouth;

};

Shape* read_shape(std::istream& is)
{
    //Read kind_of_shape

    switch (kind_of_shape)
    {
        case Circle:
            //Read p, r.
            return new Circle { p, r };
            break;

        case Triangle:
            //Read p1, p2, p3.
            return new Triangle { p1, p2, p3 };
            break;

        case Smiley:
            //Read {Point, int, Shape, Shape} int p, r.
            Smiley∗ ps = new Smiley{p,r};
            return ps;
            break;
    }
}

Percebi que o problema da implementação estava então no Shape*, ou seja, um ponteiro para uma classe abstrata, mas não entendi qual o problema.
O texto ainda descreve:

Ponteiros para objetos alocados na free store¹ são perigosos: um ‘‘plain old pointer²’’ não deveria ser usado para representar uma propriedade.

Texto original:

… pointers to objects allocated on the free store is dangerous: a ‘‘plain old pointer’’ should not be used to represent ownership.

A dúvida que ficou é: Porque o comando delete em uma varíavel do tipo Shape* talvez falhe?


1, 2) Não conheço uma tradução adequada.

genericos – Uso de métodos estáticos en un Interface Java con genéricos (operador diamante)

Estoy creando un CRUD con varias implementaciones. Para ello tengo una clase Categoria, una interfaz RepositorioI y una implementación de la interfaz CategoriaRepositorioLista (la idea es hacer diferentes implementaciones, tanto con listas, Bases de Datos tradicionales e Hibernate).

Hasta la fecha tenía la interfaz parametrizada con el operador diamante hacia el tipo del modelo, y los métodos como método de instancia. Luego pensé que, realmente, no tengo necesidad de crear una instancia de la implementación del repositorio porque no voy a utilizar atributos de instancia.

Si tengo un atributo, va a ser estático pues sólo lo voy a utilizar a nivel de clase. Lo que pase a los métodos o me devuelvan estos no se va a almacenar internamente.

La interfaz originalmente tenía este aspecto:

RepositorioI.java

package com.anubedam.repositorio.interfaces;

import java.util.List;

public interface RepositorioI<T> {
    /* Repositorio con las operaciones CRUD */
    
    // Guardar el modelo
    void guardar(T modelo);
        
    // Recuperar un modelo por su id
    T buscarPorId(long id);
    
    // Recuperar todos los modelos
    List<T> buscarTodos();
    
    // Borrar el modelo
    void borrarPorId(long id);    
    
    // Borrar todos los modelos
    void borrarTodos();  
}

El problema es cuando decido hacer los métodos de la interfaz estáticos.

package com.anubedam.repositorio.interfaces;

import java.util.List;

public interface RepositorioI<T> {
    /* Repositorio con las operaciones CRUD */
    
    // Guardar el modelo
    static void guardar(T modelo);
        
    // Recuperar un modelo por su id
    static T buscarPorId(long id);
    
    // Recuperar todos los modelos
    static List<T> buscarTodos();
    
    // Borrar el modelo
    static void borrarPorId(long id);    
    
    // Borrar todos los modelos
    static void borrarTodos();  
}

El error que me está dando, en todos los métodos, es

non-static type variable T cannot be referenced from a static
context

Es decir, que el tipo que se asocia con la interfaz es a nivel de instancia y en principio no puedo utilizar métodos estáticos con el operador diamante.

Realmente lo que yo quiero hacer es evitar el uso de tipo Object y tener que preguntar si es una instancia de tal clase o de otra y hacer casteos.

No pongo la clase del modelo ni de la implementación de la interfaz porque de lo que realmente se está quejando es de la interfaz.

¿Cómo podría hacerlo en este caso? He estado buscando por internet y no he encontrado cómo poder resolver este problema.

Muchas gracias,

string – uso de bucle while

package BucleWhile;

import java.util.Scanner;

public class Ejercicio10 {
    /* Desarrollar un programa que permita ingresar el nombre del
     alumno y una cantidad de notas por teclado y posteriormente 
     nos muestre la suma de los valores ingresados y su promedio.
    */
    public static void main(String() args) {
        String nombre;
        int notas=1,promedio=0;

        Scanner run=new Scanner(System.in);
        while( notas >=0){
            notas ++;
            System.out.print("Ingrese su nombre :");
            nombre=run.nextLine();
            System.out.print("Ingrese el N° DE NOTAS :");
            notas=run.nextInt();            
        }
    }
}

Cual es la diferencia entre el uso de parentesis y el dunder __call__ en Python?

Tengo este codigo de ejemplo:

class Meta(type):
    def __new__(metaclass, cls_name, bases, attrs):
        print(f'Saludos desde el dunder __new__ de la clase Meta')
        return type(cls_name, bases, attrs)




class Persona(metaclass = Meta):
    def __init__(self):
        pass
    def __call__():
        print(f'Saludos desde el dunder __call__ de la clase Persona')

print(Persona())

Pues bien (en python3) al ejecutar este codigo de imprime por pantalla …

Saludos desde el dunder __new__ de la clase Meta
<__main__.Persona object at 0x7fc3a8a27910>

Sin embargo en caso de que se sustituya los () por .__call__(), deja de funcionar como se esperaria ….

codigo

class Meta(type):
    def __new__(metaclass, cls_name, bases, attrs):
        print(f'Saludos desde el dunder __new__ de la clase Meta')
        return type(cls_name, bases, attrs)




class Persona(metaclass = Meta):
    def __init__(self):
        pass
    def __call__():
        print(f'Saludos desde el dunder __call__ de la clase Persona')

print(Persona.__call__())

salida

Saludos desde el dunder __new__ de la clase Meta
Saludos desde el dunder __call__ de la clase Persona
None

Es interesante ya que se supone que ambos ejemplos son equivalentes, sin embargo, en el segundo ejemplo vemos que accede al atributo __call__ de Persona algo que podria ser intuitivo, sin embargo no pasa en el primer ejemplo. Con lo cual, la pregunta seria: a cual __call__ se accede en el primer ejemplo?, y ademas, no se supone que ambos ejemplos son equivalentes?

Aclaratoria

Algo que me llamo aun mas la atencion de este ejemplo, es que en el primer caso (cuando se emplea ()) se podria pensar que se accede al dunder __call__ de la metaclase (cual el caso en el que estemos instanciando), pero no …

class Meta(type):
    def __new__(metaclass, cls_name, bases, attrs):
        print(f'Saludos desde el dunder __new__ de la clase Meta')
        return type(cls_name, bases, attrs)
    def __call__(*args):
        print(f'Saludos desde el dunder __call__ de la clase Meta')




class Persona(metaclass = Meta):
    def __init__(self):
        pass
    def __call__():
        print(f'Saludos desde el dunder __call__ de la clase Persona')

print(Persona())

salida

Saludos desde el dunder __new__ de la clase Meta
<__main__.Persona object at 0x7f8f3ce6a7f0>

middleware – Duda sobre uso de permissions en laravel

Hola a todos como estan? tengo la siguiente duda que por mas que he leido no me queda del todo claro:
Estoy trabajando con una aplicación en la cual tengo dos roles: Admin y Cliente, mediante Laravel Permissions definí diferentes permisos para cada perfil pero ahora me confundí con lo siguiente:
Necesito mostrar una vista u otra según el rol, por ejemplo tengo una vista que carga un datatabale con datos de clientes y otra vista con datos de ventas, quiero que si el usuario logueado es cliente vea solo la vista con el datatable de ventas y si es admin que vea el de clientes

Esto lo debo realizar a nivel de rutas (usando middellware), o a nivel de controlador?

Saludos a todos

certificado – Uso do swagger no mac

Estou seguindo um tutorial para a criacao de uma api com dotnet core, e estou com o seguinte problema: Ao utilizar o comando dotnet dev-certs https –trust eu deveria estar habilitado a usar o swagger, mas tenho a seguinte resposta no console:
inserir a descrição da imagem aqui

Quanto uso https://localhost:5001/swagger o servidor nao carrega. Como posso corrigir isso?

operador – Uso del “Bitwise” – Python

Se supone que ~ es el operador not a nivel binario.
Resulta que tengo el siguiente programa:

x = 4
y = 1

a = x & y
b = x | y
c = ~ x
d = x ^ 5
e = x >> 2
f = x << 2

print(a, b, c, d, e, f) 

Y me genera la siguiente salida:

0 5 **-5** 1 1 16

Esperaba que la salida fuera

0 5 **3** 1 1 16

En teoría 4 en binario = 100. Si lo niego debería ser igual a 011. Y eso es 3, no -5.
Me podrían explicar por favor por qué pasa eso.
Gracias

base de datos – error al cargar la clase PDO en php uso de namespaces

que tal tengo un problema . Hize un autoloader que es este
introducir la descripción de la imagen aquí

cada vez que carga la pagina siempre carga el autoloader, pero al querer añadirle una conexión a la DB sale este error

introducir la descripción de la imagen aquí

supongo que es por el autoloader, que esta llamando a esa clase PDO que piensa que esta el mi carpeta system, como le digo que agarre el que esta por defecto en php.

introducir la descripción de la imagen aquí