c++ 未找到函数定义(即使存在)

vlju58qv  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(322)

下面是我的主要:

#include "terremoto.h"

int main(){
    std::string filename, zona;
    std::ifstream in_stream;
    std::ofstream out_stream;
    nodo *elenco, *filtroZona;
    std::list<Terremoto> elencoDoppio;
    float K;

    // caricamento dati tramite file
    std::cout << "Inserire nome file da caricare\n";
    getline(std::cin, filename);
    in_stream.open(filename);

    // elenco è la linked list con tutti i terremoti
    elenco = carica_elenco(in_stream);

    // filtro per zone tramite input da tastiera
    std::cout << "Inserire zona da filtrare\n";
    std::cin >> zona;
    filtroZona = filtro_zona(elenco, zona);
    std::cout << filtroZona;

    // copia di elenco in una double linked list (elencoDoppio)
    elenco_to_list(elenco, elencoDoppio);
    stampa_dlist(std::cout, elencoDoppio);

    // filtro per soglia di magnitudo tramite input da tastiera
    std::cout << "Inserire soglia magnitudo (filtra per >=K)\n";
    std::cin >> K;
    filtra_magnitudo(elencoDoppio, K);
    stampa_dlist(std::cout, elencoDoppio);

    return 0;
}

这是我terremoto.h:

#ifndef TERREMOTO_H
#define TERREMOTO_H

#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
#include <list>

const int MAX_TERREMOTI = 100;
const int DIM_DATAORA = 20;

class Terremoto{
    public:
        Terremoto();
        Terremoto(const Terremoto &t);
        ~Terremoto();
        Terremoto& operator=(const Terremoto &t);
        bool operator<(const Terremoto &other) const;

        void getDataOra(char *str) const {std::strcpy(str, dataOra);}
        int getProfondita() const {return profondita;}
        float getMagnitudo() const {return magnitudo;}
        std::string getZona() const {return zona;}
        std::string getAnno() const; 
    
    private:
        std::string zona;
        char* dataOra;      // 19 lettere "aaaa-mm-gg hh:mm:ss"
        int profondita;     
        float magnitudo;    // intervallo (0.0, 10.0)

    friend std::istream& operator>>(std::istream &in, Terremoto &t);
    friend std::ostream& operator<<(std::ostream &out, const Terremoto &t);
};

struct nodo{
    Terremoto value;
    nodo *next;
}; 

nodo* carica_elenco(std::ifstream &in);
void stampa_slist(std::ofstream &out, nodo* n);
float media_magnitudo(nodo *n, std::string anno);
nodo* filtro_zona(nodo* n, std::string zona);
void elenco_to_list(nodo *n, std::list<Terremoto> &l);
void stampa_dlist(std::ostream &out, std::list<Terremoto> &l);
void stampa_recenti(std::ostream &out, std::list<Terremoto> &l, int n);
void filtra_magnitudo(std::list<Terremoto> &l, float K);

#endif

这是我的terremoto.cpp:

#include "terremoto.h"

Terremoto::Terremoto(){
    dataOra = new char[DIM_DATAORA];
}

Terremoto::Terremoto(const Terremoto &t){
    dataOra = new char[DIM_DATAORA];

    zona = t.zona;
    strcpy(dataOra, t.dataOra);
    profondita = t.profondita;
    magnitudo = t.magnitudo;
}

Terremoto::~Terremoto(){
    delete dataOra;
}

Terremoto& Terremoto::operator=(const Terremoto &t){
    if (&t != this){
        zona = t.zona;
        strcpy(dataOra, t.dataOra);
        profondita = t.profondita;
        magnitudo = t.magnitudo;
    }

    return *this;
}

std::string Terremoto::getAnno() const{
    std::string dataOraString(dataOra);
    std::string anno = dataOraString.substr(0,4);
    return anno;
}

std::istream& operator>>(std::istream &in, Terremoto &t){
    std::getline(in, t.zona, ',');
    in.getline(t.dataOra, DIM_DATAORA, ',');
    in >> t.profondita;
    in >> t.magnitudo;
    in.ignore();

    return in;
}

std::ostream& operator<<(std::ostream &out, const Terremoto &t)
{
    out << t.zona << ","
        << t.dataOra << ","
        << t.profondita << ","
        << t.magnitudo << std::endl;

    return out;
}

bool Terremoto::operator<(const Terremoto &other) const{
    int year = std::stoi(getAnno());
    int otherYear = std::stoi(other.getAnno());

    return year < otherYear;
}

nodo* push_front(nodo *n, Terremoto t){
    nodo *temp;
    temp = new nodo;

    temp->value = t;
    temp->next = n;

    return temp;
}

nodo* carica_elenco(std::ifstream &in){
    nodo *n;
    Terremoto t;

    n = 0;
    while (in >> t){
        n = push_front(n, t);
    }

    return n;
}

void stampa_slist(std::ofstream &out, nodo* n){
    while (n && out){
        out << n->value;
        n = n->next;
    }

    return;
}

float media_magnitudo(nodo *n, std::string anno){
    float media = 0.0;
    int count = 0;

    while (n){
        if((n->value).getAnno() == anno){
            media += (n->value).getMagnitudo();
            count++;
        }
        n = n->next;
    }

    media /= count;
    return media;
}

nodo* filtro_zona(nodo* n, std::string zona){
    nodo *n2 = 0;

    while (n){
        if ((n->value).getZona() == zona){
            push_front(n2, (n->value));
        }
        n = n->next;
    }

    return n2;
}

void elenco_to_list(nodo *n, std::list<Terremoto> &l){
    while (n){
        l.push_back(n->value);
        n = n->next;
    }
    return;
}

void stampa_dlist(std::ostream &out, const std::list<Terremoto> &l){
    std::list<Terremoto> temp;
    std::list<Terremoto>::iterator iter;

    temp = l;

    for (iter = temp.begin(); iter != temp.end(); iter++){
        out << *iter;
    }
    out << std::endl;
    return;
}

void stampa_recenti(std::ostream &out, const std::list<Terremoto> &l, int n){
    std::list<Terremoto> temp;
    std::list<Terremoto>::iterator iter;
    int count;

    temp = l;
    temp.sort();

    for (iter = temp.begin(), count = 0; iter != temp.end() && count < n; iter++){
        out << *iter;
        count++;
    }
    out << std::endl;
    return;
}

void filtra_magnitudo(std::list<Terremoto> &l, float K)
{
    std::list<Terremoto>::iterator iter;

    iter = l.begin();

    while (iter != l.end()){
        if (iter->getMagnitudo() < K){
            iter = l.erase(iter);
        }
        else
            iter++;
    }
    return;
}

(Visual Studio代码)Terremoto. h-从第43行开始:

  • 标记列表(...):VSCode建议“找不到'stampa_elenco'的函数定义”(这不是函数的名称,我也尝试重新启动,但错误仍然存在。
  • 元素列表(...):和上面一样,但这次函数名是正确的。
  • 标记列表(...):同样,它指出“stampa_elenco()”缺少一个定义,而且这也不是名称。

编译时,我只得到一个stampa_dlist(...)错误,如下所示:
未定义对“stampa_dlist(std::ostream&,std::__cxx11::list〈远程列表,std::分配器〉&)”的引用
显然是在 Backbone.js 道上发现的。

hfyxw5xn

hfyxw5xn1#

正如Richard Critten所建议的,定义中的“const”显然有问题,无论你检查多少,有时候完全不熟悉CS和需要休息的组合确实会击中:D
很抱歉问了这么愚蠢的问题,但还是谢谢你让我大开眼界

相关问题