2017-01-14 1 views
0

У меня есть это требование.C++ Класс -> Вектор -> Файл

Я пытаюсь создать простую схему базы данных, немного отличающуюся от того, что я видел здесь. У меня есть файл класса (client.h) с его реализации (client.cpp):

#ifndef CLIENT_H_ 
#define CLIENT_H_ 
#include <iostream> 
using namespace std; 
class Client { 
public: 
    // constructors 
    Client(); 
    Client(string new_name, string new_tel, string new_addr); 
    // getters 
    string getName(); 
    string getAddr(); 
    string getTel(); 
    // setters 
    void setName(string); 
    void setAddr(string); 
    void setTel(string); 
    void display(); 
    void input(); 
private: 
    // fields 
    string name; 
    string addr; 
    string tel; 
}; 
#endif /* CLIENT_H_ */ 

/* 
*ad client.cpp 
* 
* Created on: Jan 12, 2017 
*  Author: niksarid 
*/ 

#include <iostream> 
#include "client.h" 
using namespace std; 

Client::Client() { 
    setName(""); 
    setAddr(""); 
    setTel(""); 
} 

Client::Client(std::string new_name, std::string new_addr, std::string  new_tel) { 
    setName(new_name); 
    setAddr(new_addr); 
    setTel(new_tel); 
} 

string Client::getName() { 
    return name; 
} 

string Client::getAddr() { 
    return addr; 
} 

string Client::getTel() { 
    return tel; 
} 

void Client::setName(string p_name) { 
    name = p_name; 
} 

void Client::setAddr(string p_addr) { 
    addr = p_addr; 
} 

void Client::setTel(string p_tel) { 
    tel = p_tel; 
} 

void Client::input() { 
    string tmp; 

    cout << "INPUT CLIENT INFO" << endl; 
    cout << "Name: "; 
    cin >> tmp; 
    setName(tmp); 
    cout << "Address: "; 
    cin >> tmp; 
    setAddr(tmp); 
    cout << "Telephone: "; 
    cin >> tmp; 
    setTel(tmp); 
} 

void Client::display() { 
    cout << name << "\t" << addr << "\t" << tel << endl; 
} 

Так что я пытаюсь сделать класс компании, который будет содержать вектор клиентов и при запуске программы она загрузит файл данных «clients.dat» в вектор. Я смогу добавить клиента или удалить клиента из вектора. В конце вектор будет сохранен обратно на «clients.dat».

Итак, файл (company.h), как это:

class Company { 
public: 
    Company(); 
    ~Company(); 
    void add_client(); 
    void print_clients(); 
    void loadClientsFromFile(); 
    void saveClientsToFile(); 
private: 
    vector<Client> clients; 
} cmp; 
#endif /* COMPANY_H_ */ 

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

EDIT: Извините! Забыл важную часть! Например, когда я пытаюсь add_client(),

void add_client() { 
    Client c; 

    c.input(); 
    clients.push_back(c); 
} 

, но я получаю ../src/company.cpp:49:2: ошибка: «клиенты» не был объявлен в этой области видимости clients.push_back (с);

Итак, как достичь этого?

+2

Описание проблемы нечеткое, вы получаете ошибку компилятора? –

+1

Какая ошибка возникает при попытке получить доступ к вектору 'clients' в' Company :: print_clients() 'например? – merlinND

+0

Просьба представить код реализации функций-членов класса Company, где вы пытаетесь получить доступ к вектору. Вы уверены, что не забыли добавить Company :: как префикс имен функций в company.cpp? – Morgan

ответ

0

Как Морган упоминалось в комментариях, эта проблема обычно возникает при попытке определить функцию члена в файле реализации, но забудьте добавить имя класса в качестве префикса (например void add_client() {} вместо void Company::add_client() {}.

Эта ошибка является общепринятым и может легко остаться незамеченным, поскольку совершенно правильно определить новую бесплатную функцию под названием add_client в вашем файле, которая не имеет ничего общего с классом Company. Вот почему компилятор только жалуется, когда вы пытаетесь получить доступ к элементу данных , но не раньше.

 Смежные вопросы

  • Нет связанных вопросов^_^