«AddCustomer» не был объявлен в этой области. Где ошибка?

Моя цель разработать базу данных для Заказчика, поэтому я начал создавать Datbase.h, Database.cpp и классический main.cpp. Когда я запускаю, я получил следующую ошибку:

«AddCustomer» не был объявлен для этой области

В Database.cpp вы найдете только пример. Я убежден, что в классе что-то не работает, но я не знаю. Где по вашему ошибка? Большое спасибо, я схожу с ума

main.cpp

#include <iostream>
#include <string>
#include <fstream>
#include <cstdio>

using namespace std;

#include "Database.cpp"

int main()
{
int choice;

//creating a menu for Database
cout<<"\t1. Add new customer"<<endl;
cout<<"\t2. Search Database for Customer"<<endl;
cout<<"\t3. Clear File"<<endl;
cout<<"\t4. Edit File "<<endl;
cout<<"\t5. Exit Program"<<endl;

cin>>choice;

switch (choice){
    case 1:
        AddCustomer();
        break;
        
    case 2: 
        break; 
//...
        
  }
}

База данных.cpp

#include "Database.h"

using namespace std; 

Database::Database(){ 
}

void Datbase::AddCustomer(){
cout<< "It works"<<endl //it's an example 
}

void Datbase:: searchname(){
}

void Datbase:: searchmail(){
}

void Datbase:: searchcell(){
}

void Datbase:: quit(){
}

void Datbase:: displayall(){
}

void Datbase:: search(){
}

void Datbase:: deleteFile(){
}

void Datbase:: editFile(){
}

База данных.h

#ifndef DATABASE_H_INCLUDED
#define DATABASE_H_INCLUDED

#endif // DATABASE_H_INCLUDED

 class Database 
  {

 public: 

    Database();
    void AddCustomer(); 
    void searchname(); 
    void searchemail(); 
    void searchcell(); 
    void quit(); 
    void displayall(); 
    void search(); 
    void deleteFile(); 
    void editFile(); 
 };

вы не должны включать исходный файл. Вместо этого включите заголовок, а затем свяжите скомпилированные источники

463035818_is_not_a_number 24.12.2020 18:16

Итак, в main.cpp я могу изменить «Database.cpp» на «Database.h»?

MacUser 24.12.2020 18:19

Кроме того, AddCustomer — это метод, вам нужно создать объект Database, чтобы иметь возможность вызывать его.

codeconscious 24.12.2020 18:20

не могли бы вы привести практический пример? Это мой первый раз, когда я использую oop

MacUser 24.12.2020 18:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка связана с тем, что вы использовали AddCustomer() в случае оператора switch, который компилятор ожидает быть доступным в глобальной области видимости, поэтому не может его найти.

Поскольку это функция-член класса базы данных, вам потребуется получить к ней доступ через объект. Например.

int main()
{
int choice;
Database db;

cin>>choice;

switch (choice){
    case 1:
        db.AddCustomer();
        break;
        
    case 2: 
        break; 
//...
        
  }
}

Также вы должны включить заголовок, а не файл cpp напрямую.

И, если вы хотите использовать его без объявления объекта (хотя, похоже, это не ваш случай), вы можете сделать функцию-член статической для класса, а затем получить доступ как

Database::AddCustomer()

Да, потому что вы можете получить доступ к функции, используя экземпляр класса базы данных.

AdityaG15 24.12.2020 18:24

Кроме того, когда компилятор говорит, что не находит что-то в «области», вы должны сначала посмотреть, является ли это функцией-членом, а затем получить доступ с использованием объекта; хотя это может быть и из-за простых опечаток, например, отсутствия точки с запятой, тогда компилятор не сможет идентифицировать следующее определение функции. То же самое относится и к переменным (хотя глобальные переменные следует использовать, когда вы точно знаете, что так будет лучше, в больших проектах обычно не будет глобальных переменных)

AdityaG15 24.12.2020 18:27

Я не могу понять, как решить проблему. Я включил "Database.h" вверху основного и после...

MacUser 24.12.2020 18:31

Добавьте // создание объекта с именем 'db' класса Database ``` Database db; ``` затем получите доступ к AddCustomer следующим образом -> ``` db.AddCustomer(); ``` Это должно работать, если нужно, напишите мне в mobile.twitter.com/AdityaGupta150 Там вы также можете отправить изображение ошибки, хорошо, чтобы помочь :D

AdityaG15 24.12.2020 18:34

@MacUser Вы задали практический пример в комментариях, см. этот ``` class DataBase{ public: void AddRow(){ /*логика добавления строки*/ } } int main(){ DataBase mydata; мои данные.AddRow(); } Вот как вы получаете доступ к member function, функциям, определенным внутри класса/структуры, также это называется «оператор точки», если вы хотите увидеть больше, вы можете найти это

AdityaG15 24.12.2020 18:38

Значит, я должен скопировать то, что я написал в Database.h, вверху основного?

MacUser 24.12.2020 18:46

Не нужно, так тоже должно работать. Поскольку на самом деле #include просто копирует содержимое Database.h поверх файла main.cpp.

AdityaG15 24.12.2020 18:48

@MacUser Вы решили проблему?

AdityaG15 24.12.2020 18:50

Нет, не пробовал, но ищу решение по вашим советам

MacUser 24.12.2020 18:52

Подождите, как вы его компилируете? Вам нужно скомпилировать как main.cpp, так и Database.cpp одновременно, иначе он покажет «связанную ошибку», подобную этой (неопределенная ссылка на...)

AdityaG15 24.12.2020 18:58

Сборка: отладка в DataCustomer (компилятор: компилятор GNU GCC) ----------------

MacUser 24.12.2020 19:01

Вот что возвращает CodeBlocks

MacUser 24.12.2020 19:01

Один из них может помочь, видите ли, я думаю, что вы may делаете неправильно с несколькими файлами в кодовом блоке youtube.com/watch?v=qR2aS6t9-8k youtube.com/watch?v=rpipDcG8GMg Один для C код, но ваш код будет нормально работать с ним

AdityaG15 24.12.2020 19:08

Теперь я получаю эту ошибку: оператор не может разрешить адрес перегруженной функции

MacUser 24.12.2020 19:36

Это тогда другое, чем тема здесь на самом деле. Но вы можете получить такую ​​ошибку, если вы использовали шаблоны ИЛИ, возможно, вы просто вызвали функцию с другим аргументом, например, вызов AddCustomer(4), в то время как AddCustomer определен таким образом, что не требует аргумента, поэтому вам может потребоваться изменить определение in this case в AddCustomer(int) и т.д. *Примечание -> Сообщения об ошибках зависят от компиляторов

AdityaG15 25.12.2020 09:34

Вы это поняли? Если нет, вы можете просто не принять мой ответ, на вопрос может ответить кто-то другой: D

AdityaG15 29.12.2020 13:13

Другие вопросы по теме