Duvida no algoritmo C++!

#include <iostream>

using namespace std;

    struct XLivro {
    string titulo;
    string autor;
    int codigo;
    float preco;
};

int main() {
    
    int tamanho;
    XLivro *livro;
    livro = new XLivro[tamanho];
    int i = 0;
    
    char op;
    do{
       cout << "\n \n \n \t \t******** MENU OPERACOES ********* \n";
       cout << "\t\t I - Incluir livro \n";
       cout << "\t\t L - Listar nome dos livros\n";
       cout << "\t\t A - Procurar livro por autor\n";
       cout << "\t\t T - Procurar livro por titulo\n";
       cout << "\t\t M - Calcular a media de preco dos livros\n";
       cout << "\t\t S - Para sair\n";
       cout << "\t \t********************************* \n";
	   cout << "\t\t Digite sua opcao:";
       cin >> op;
       
       system("cls");
       
             if(op == 'i'){
                   
             cout <<"\n-----Incluir livro------\n";
             cout<<"Titulo: ";
             cin >>livro[tamanho].titulo;
             cout<<"Autor: ";
             cin >>livro[tamanho].autor;
             cout<<"Codigo: ";
             cin>>livro[tamanho].codigo;
             cout<<"Preco: ";
             cin>>livro[tamanho].preco;           
             cout << "\n-----------------------------\n";
    }
    
    }while(op != 's');
    
    system("PAUSE");
    return 0;
}

Ele da um erro e trava quando eu testo o cadastrar livro… podem me ajudar?

Qual erro dá?

Ele compila, mas quando aperto i para inserir um livro ele abre la titulo, eu digito o titulo e ao invez dele pular para autor que é o proximo dado a ser cadastrado, ele trava… Livros.exe que é como eu salvei parou de funcionar… fechar programa.

int tamanho; XLivro *livro; livro = new XLivro[tamanho];

Você não inicializou a variável tamanho.

Também seria melhor usar um vector<shared_ptr><Livro>> do que um ponteiro para livros.

Inicializei sim, está ali em cima


    int tamanho;
    XLivro *livro;
    livro = new XLivro[tamanho];
    int i = 0;

não pode ser feito com ponteiro ainda, tem que ser feito dessa forma a pedido do professor, ele vai entrar em ponteiro agora.

Você está usando ponteiros. Isso aqui, é a criação de um ponteiro:

Ali você declarou a variável tamanho, mas não a inicializou. Para inicializar, precisa atribuir um valor:

como faço para ela ser dinamica e nao estatica?

Utilize um vector<shared_ptr>>, tal qual o Vini escreveu.

Utilize um vector<shared_ptr>>, tal qual o Vini escreveu.[/quote]

Esse vector ainda implementa um coletor de lixo por contagem de referência com shared_ptr. É a melhor solução, mas se for para treinar ponteiros tem que ser daquela forma.

#include <iostream>

using namespace std;

struct TLivro{

string titulo;
string autor;
string codigo;
float preco;

};

const int n = 2;
      
       void LerLivro(TLivro &d){
       cout <<"\n-----Incluir livro------\n";
       cout<<"Titulo: ";
       cin >> d.titulo;
       cout<<"Autor: ";
       cin >> d.autor;
       cout<<"Codigo: ";
       cin>> d.codigo;
       cout<<"Preco: ";
       cin>> d.preco;           
       cout << "\n-----------------------------\n";
       }
       
      void ListaLivros(TLivro d){
      cout << "\nTitulo do livro: " << d.titulo <<"\n";
      cout << "Autor: " << d.autor <<"\n";
      cout << "Codigo: " << d.codigo <<"\n";
      cout << "Preco: " << d.preco <<"\n";
}

int main(){
    
    TLivro Biblioteca[n];
    
    cout << "\n ========== ENTRADA DE LIVROS ========== \n";
    
         for(int i=0; i < n; i++)
         {
            LerLivro(Biblioteca[i]); // Função que lê de teclado os dados do livro
         }
    
    cout << "\n ========== LISTA DE LIVROS ========== \n";
    
         for(int i=0; i < n; i++)
         {
            ListaLivros(Biblioteca[i]); // Função que lista todos os livros
         }
    
    system("PAUSE");
    return 0;
}

poderiam me ajudar a criar um vetor em cima desse codigo que fiz para cadastrar n livros?