2010-07-12 10 views
10

Sto cercando suggerimenti di progetto che mi obblighino a "sporcarmi le mani" con funzionalità avanzate di C++. Sto parlando di progetti che utilizzerebbero tutta la potenza del linguaggio (STL o addirittura potenziamento (non l'ho ancora usato molto)).Cosa devo codice per entrare nelle profondità del C++ avanzato?

Perché? Perché voglio imparare, voglio trovare nuove sfide. Al lavoro, le cose cominciano a essere noiose, davvero. Ero abituato a incontrare costantemente cose nuove, nuove idee e caratteristiche. Questa è la maggior parte delle volte non è il caso del codice aziendale legacy, come puoi immaginare. Eppure, osservando alcune domande e risposte che approfondiscono i modelli, i puntatori condivisi e tutte le cose che mi capitano mi ritrovo perso, non sapendo la risposta o, peggio ancora, non capisco nemmeno cosa sta succedendo.

Ecco perché sto cercando qualcosa che potrei codificare me stesso, utilizzando preferibilmente solo C++ (+ boost forse) - un'utilità della riga di comando, nessuna grafica per favore. E davvero non voglio unirmi a nessuna comunità open source. Guardare il codice degli altri è utile, lo so. Ma è quello che faccio molto al lavoro quindi ... no, grazie. Il progetto può essere qualsiasi cosa, significativa o priva di significato, un'utilità utile o semplicemente qualcosa che non ha un reale utilizzo. L'unico requisito è che mi costringa a testare veramente le mie abilità in C++. O almeno dovrebbe essere molto difficile o addirittura impossibile da codificare con le conoscenze di base del C++ - Sono il tipo di persona che non è mai soddisfatta del codice che funziona, quindi credo che questo mi costringerà ad imparare. Ma tieni presente che io sono un uomo che lavora e il mio tempo è limitato, quindi risposte come "code your own OS" non saranno di grande aiuto.

+6

wiki della comunità ... –

+1

Dubito che tutto possa "forzare" l'utente a utilizzare le strutture C++ avanzate. Qualsiasi problema può essere risolto proceduralmente con meno efficienza/scalabilità/ecc. Per apprendere concetti linguistici avanzati dovrai capire che sono lì, leggere su di loro, imparare come incorporarli nei disegni, quindi disegnarli su se necessario. Tutte queste cose richiedono tempo quindi non creare un vincolo artificiale che sei troppo occupato per fare ciò che è necessario. –

+5

Più un progetto diventa complesso, minore è il mio desiderio di utilizzare funzionalità linguistiche "avanzate". –

risposta

6

Cosa devo codice per entrare nelle profondità del C++ avanzato?

  1. saperne di più,
  2. imparare ancora di più,
  3. imparare ancora di più.

E, no, non sto scherzando. Affatto. Ho iniziato a imparare C++ circa 15 anni fa e sto ancora imparando nuove cose su base regolare.

Dai un'occhiata allo The Definitive C++ Book Guide and List e fai la tua scelta.
Mi consiglia moderna C++ design da Andrei Alexandrescu e C++ Templates La guida completa da Vandevoorde & Josuttis. Questi due soli sono abbastanza interessanti per mantenere un programmatore che ottiene nuove idee per mesi, se non anni. (Nota che leggerli in questo ordine ha il vantaggio che il libro di Andrei è più sottile e ti fa venir voglia di leggere l'altro solo per deludere completamente ciò che scrive. Leggendoli in ordine inverso ha il vantaggio che non ti perderai più spesso nel libro di Andrei. Qualunque cosa preferisca.)

+1

Vorrei raccomandare quegli stessi due libri, ma prima leggere _C++ Templates_ (almeno le prime due sezioni) ... il suo contenuto è molto utile quando si legge _Modern C++ Design_. –

+0

@James: In effetti stavo pensando se raccomandare in questo ordine o viceversa. Non sono sicuro, ma aggiungerò una nota al riguardo. Grazie per segnalarlo. – sbi

+0

+1 Oltre ai progetti, i libri sono un'ottima fonte di informazioni. Grazie per aver suggerito questi due. Li darò un'occhiata! – PeterK

1

Scrivere un server Web a forcella o multithread. Scrivi lisp. Creare un database (l'intera procedura, SQL opzionale).

+0

+1 Sì. La creazione di un sistema utile e non banale basato sulla conoscenza del suono CS (come le idee sopra elencate) ti aiuterà ad apprendere entrambi: la tua lingua preferita nell'applicazione del mondo reale e alcuni argomenti CS avanzati. Quest'ultimo lo trovo molto più prezioso, ma vale anche la pena imparare. –

2

Qualcosa come una libreria matematica a matrice potrebbe essere sulla falsariga di quello che stai cercando. Un sacco di potenziali usi di algoritmi e contenitori. Tutto è stato fatto prima di tutto, ma se stai cercando qualcosa di veloce e sporco da provare, è quello che cercherò.

+0

+1 per il "veloce e sporco", lo considererò come un esempio di partenza :) – PeterK

+0

L'altro vantaggio è che puoi sempre confrontare la tua implementazione con il modo in cui gli altri lo hanno fatto. Evita solo la tentazione di guardare prima ad altre implementazioni - fai un salto e poi guarda come è stato migliorato altrove. Con questo in mente, avere un altro andare, partendo da zero se necessario. Con l'esempio dato dovrebbe essere tutto relativamente piccolo. G'luck. – cristobalito

0

Selezionare qualsiasi struttura di dati avanzata (ad es. Albero, coda di priorità ecc.) E implementarla.

In questo modo si imparerà a:
- design in maniera OOP
- Fornire un utile e coerente API
- utilizzare correttamente successione, i modelli, le funzioni inline per esaudire i vostri obiettivi di implementazione
- Scrivi codice multipiattaforma
- Scrivi test unitari completi

Utilizzare il codice STL come riferimento per le operazioni da eseguire.

+1

Come utilizzeresti l'STL per apprendere il design OO?L'STL non riguarda affatto la programmazione orientata agli oggetti (ereditarietà del polimorfismo di runtime?), Si tratta di _Generic Programming_. Se fosse OO, tutti i contenitori avevano la stessa classe base che definiva metodi astratti come 'append()' e 'sort()', e si potevano mettere solo i discendenti di 'object' in essi. Ho visto la mia parte di questa biblioteca negli anni '90, e sono molto contento che Stepanov sia venuto e ci abbia insegnato come farlo meglio. – sbi

0

Cosa devo codice per entrare nelle profondità del C++ avanzato?

C++ non ha alcuna reale avanzata caratteristica, la lingua è ben fatto, le caratteristiche anticipate sono l'uso di molte librerie che esiste in tutto il mondo.

dalle librerie Math, grafica, comunicazione, finestre/x-windows/kde/gnome, ecc

se si vuole imparare una libreria di comunicazione maturo suggerisco l'uso di The ADAPTIVE Communication Environment (ACE(TM)) che è un po old-fashion ma hanno un bel mazzo di concetti avanzati del linguaggio.

Hanno una curva di apprendimento elevata ma è utilizzato da tutti i sindaci companies in tutto il mondo.

D'altra parte l'evitamento di utilizzare un'utilità grafica è masochista perché si perde tempo in cose che qualsiasi GUI ha risolto.

Si può usare NetBeans o Eclipse come multi-piattaforma, gli sviluppatori di KDE per Linux (con KDE), MS Visual Studio in Windows, ecc

+0

volatile è ciò che chiamerei caratteristica avanzata. Non è necessario utilizzarlo nella maggior parte degli scenari di programma. –

+0

@Bruno Non usato spesso! = Advanced, molto raramente (in realtà mai) usa l'operatore virgola, ad esempio, ma è poco avanzato. –

+0

La verifica di http://www.cs.wustl.edu/~schmidt/PDF/MT-CORBA4.pdf è stata un'esperienza illuminante sulle complessità dell'elaborazione parallela sincronizzata e sull'indipendenza dalla piattaforma – manifest

4

Lei ha citato la creazione di qualcosa di simile a 'un programma di utilità inutile'. Piuttosto, suggerirei di pensare a un'applicazione o un'utilità che sarebbero personalmente utili a te, o forse a un sostituto di un'applicazione che già usi che potresti progettare per soddisfare le tue esigenze, i flussi di lavoro, l'estetica, ecc. Scegli alcuni particolari cosa che vuoi imparare da questo progetto, ad esempio puntatori intelligenti, boost, metaprogrammazione dei modelli, espressioni regolari, multi-threading, networking. Quindi scopri come implementare l'applicazione utilizzando la tecnologia selezionata. Ovunque ci sia un po 'di codice per farlo, sai già come fare e poi costringerti a pensare a come farlo nel nuovo linguaggio. Ad esempio, prova a scrivere l'applicazione usando solo puntatori intelligenti.

Il pericolo, trovo, nel creare una stupida app demo è che non hai alcun incentivo a finirlo. Molto meglio avere un obiettivo in mente di uno strumento che ti è utile. Questo è esattamente quello che sto facendo io stesso in questo momento: ho un flusso di lavoro molto contorto per importare foto, taggarle, rinominarle e modificarle, così ho deciso di scrivere un'applicazione in C# e WPF per fare questo per me. Questo mi dà l'impulso di vedere il progetto.

Costringersi a risolvere problemi familiari utilizzando tecniche non familiari è un ottimo strumento di apprendimento.

+5

+1 Non riesco a vedere il punto nello scrivere codice che non risolve un problema reale, né per te né per qualcun altro. –

-1

Una risposta abbastanza obiettiva: ho sempre pensato che la cosa più potente dello sviluppo OO fosse il polimorfismo. E i suoi usi si osservano meglio quando si tratta di modelli di progettazione.

Quindi, mi consiglia di ottenere il Design Pattern bible da GoF e scrivere il codice che lo utilizza. L'applicazione?Può essere qualsiasi, come affermato in precedenza, perché nulla ti costringe a utilizzare qualsiasi funzionalità avanzata di qualsiasi cosa.

(volete una prova? Alcuni dei sistemi più complessi al mondo sono scritte in COBOL da persone con conoscenza zero teorica in CS)

+1

Um Ho lavorato con i programmatori COBOL e ho persino scritto un po 'di COBOL - i loro sistemi non sono poi così complessi, rispetto ai sistemi di trading o di gestione dei rischi (che non sono mai scritti in COBOL). –

+0

Io lavoro con il sistema COBOL. Per lo più finanziario, che si occupa di rischio, con credito e molte altre cose. Questi sistemi hanno un'enorme complessità, soprattutto perché sono grandi, hanno bisogno di funzionare bene con molti dati e errori minori possono causare grossi problemi. Forse la nostra definizione di complesso è diversa. –

0

provare a scrivere pool di memoria di fantasia. Sicuramente le tue mani si sporcheranno molto presto. Se ciò non bastasse, aggiungi funzionalità di garbage collection)

0

Uno strumento di profiler C++ ti consente di esaminare le profondità della lingua.

1

Ho eseguito tutti gli esercizi in The C++ Programming Language di Stroustrup: Special Edition nel corso di circa 6 mesi. Ne valeva la pena.

0

Il progetto può essere qualsiasi cosa, significativo o senza senso, un utile utilità o solo qualcosa fatta che non ha reale utilizzo.

È molto meglio rendere qualcosa di utile. Puoi usarlo (e ti renderà più contento di usare la tua applicazione) e potrai condividerlo (progetto open source - o no).

L'unico requisito è che sarebbe costringermi a testare veramente le mie competenze C++.

OK, qui ci sono alcune idee fuori della parte superiore della mia testa: (? Espressioni, un linguaggio semplice, XML, espressioni logiche)

Scrivi un parser per qualcosa. Meglio ancora, scrivere un parser/interprete per un linguaggio simile a un prologo (si definiscono predicati, oggetti e relazioni) quindi fare in modo che l'applicazione esegua l'inferenza sulle regole date per ottenere un risultato).

Scrivere un pacchetto di espressioni regolari o un debugger di espressioni regolari (qualcosa in cui si fornisce una stringa e un motivo e indica fino a quale punto del modello è stata trovata una corrispondenza della stringa). Quando si scrive un'espressione regolare complessa, una tale applicazione sarebbe molto utile.

Scrivi un pacchetto XML per l'inclusione in boost (hey, volevi qualcosa che ti costringesse a davvero a testare le tue abilità con il).

Scrivere un modulo di valore fuzzy-logic con operazioni logiche completamente supportate (con - diciamo - cinque valori di verità: falso, probabilmente falso, sconosciuto, probabilmente vero, vero).

Scrivere un pacchetto AI, che consente di progettare e implementare facilmente varie reti neurali con funzioni di apprendimento/feedback personalizzate.

O almeno dovrebbe essere molto difficile o addirittura impossibile il codice con conoscenza di base di C++

Con conoscenza di base di C solo è possibile scrivere le piattaforme grafiche, sistemi operativi e sistemi di gestione di database , pacchetti matematici e di crittografia e così via (praticamente tutto). Non c'è nulla di impossibile da codificare con una conoscenza di base di C++).

La tua immaginazione è davvero il tuo limite.

Problemi correlati