2010-08-19 14 views
5

Actualmente estoy creando un conjunto de funciones comunes (implementaciones de algoritmos de búsqueda), y creo que estoy haciendo una agrupación incorrecta. Por el momento, tengo una clase, clasificación, que se declara en un archivo llamado Sorting.h (que está muy lejos de terminado todavía, por cierto), así:Creando un contenedor 'cosa' en C++ para mantener las funciones estáticas. ¿Qué debería ser "cosa"?

#ifndef SORTING_H 
#define SORTING_H 

#include <vector> 

class Sorting { 

private: 
    Sorting(); 
    Sorting(const Sorting& orig); 
    virtual ~Sorting(); 

public: 
    static void bubbleSort(std::vector<int>& A); 
    // etc 
}; 

#endif /* SORTING_H */ 

Ahora, debido a que el constructor es privado, un usuario no puedo crear una instancia de mi clase; de ​​hecho, es solo un titular de funciones estáticas que el usuario puede llamar. Sin embargo, por lo que he leído de C++ hasta ahora, y de ver las bibliotecas de STL, etc., creo que estoy haciendo esto mal. ¿Debería, en cambio, tener un espacio de nombre llamado 'Clasificación' o algo por el estilo? Si es así, ¿qué aspecto tiene mi archivo de encabezado (el que el usuario incluiría)? ¿Y tendría que cambiar la estructura del resto de los archivos? Por el momento, cada conjunto de algoritmos se encuentra en su propio archivo cpp (es decir, BubbleSort.cpp, CocktailSort.cpp, etc.).

Disculpas por lo que podría ser una pregunta duplicada: busqué C++ y espacio de nombres, pero recibí preguntas muy generales sobre espacios de nombres y ninguno parecía ser este problema específico.

Respuesta

4

Use un espacio de nombre. Las personas que llaman del código no necesitarán preocuparse. Además, necesita plantilla en cualquier tipo ordenable, un tipo que solo puede ordenar un vector de enteros es bastante malo. Seguir la definición provista por std :: sort.

namespace Sorting { 
    template<typename Iterator> void cocktail_sort(Iterator a, Iterator b) { 
     // implement cocktail sort 
    } 
    template<typename Iterator> void bubble_sort(Iterator a, Iterator b) { 
     // implement bubble sort 
    } 
}; 

La persona que llama no importa si usted es estáticamente en una clase, pero el simple hecho es que se pierda la semántica y el tiempo que tienen en una clase, y no representa con precisión la intención. No está mal, per se, pero es algo malo. El uso de un espacio de nombres también permite a las personas que llaman usar el uso del espacio de nombres de clasificación; semántica.

+0

'(Iterator first, Iterator last)', para ilustración. – Potatoswatter

+0

Gracias. Voy a pasar a las plantillas pronto, solo estaba tratando de descubrir cómo se puede saber si una clase/primitiva con plantilla es comparable en C++, es decir, cómo sé que funcionará cuando se le llame "<", etc. ¿O es algo que debería preocupar al usuario final? Como otra pregunta, aquí pones cocktail_sort y bubble_sort en la misma declaración de espacio de nombres. ¿Puedo usar varios archivos separados para esto? – Stephen

+0

@DeadMG: dos sugerencias: 1. Los nombres de tipo generalmente describen el tipo de iteradores necesarios, p. 'RandomAccessReadableWriteableIterator' o' ForwardReadableWriteableIterator'. 2. Como alternativa a los iteradores, puede usar rangos, que son más flexibles y fáciles de usar. – Philipp

1

No importa, una función gratuita en un espacio de nombres logra lo mismo. La sintaxis para llamarlo es idéntica.

0

Lo recomiendo usando un espacio de nombres si la clase no se va a crear una instancia.

Cuestiones relacionadas