[英]'View v' has incomplete type and cannot be defined C++
#include <iostream>
#include <string>
#include <vector>
class Contact;
class Controller;
class View;
class Contact {
private:
std::string name;
std::string phone;
public:
std::string get_name() {
return name;
}
std::string get_phone() {
return phone;
}
void set_name(std::string name) {
this->name = name;
}
void set_phone(std::string phone) {
this->phone = phone;
}
};
class Controller {
public:
void delete_contact(std::vector<Contact> &data) {
std::cout << "Choose a number from 1 to 3.\n";
std::cout << "1. Delete by id\n";
std::cout << "2. Delete by name\n";
std::cout << "3. Delte by phone\n";
int choice;
std::cin >> choice;
enum { ID = 1, NAME = 2, PHONE = 3 };
if (choice == ID) {
int id;
std::cout << "Enter id: \n";
std::cin >> id;
delete_by_id(data, id);
}
else if (choice == NAME) {
std::string name;
std::cout << "Enter name: \n";
std::cin >> name;
delete_by_name(data, name);
}
else if (choice == PHONE) {
std::string phone;
std::cout << "Enter phone: \n";
std::cin >> phone;
delete_by_phone(data, phone);
}
else {
std::cerr << "Wrong choice.\n";
}
}
void delete_by_id(std::vector<Contact> &data, const int id) {
// valid ids are in range [1 .. data.size()]
if (id < data.size() || id > data.size()) {
std::cerr << "id not found\n";
return;
}
std::cout << "Contact " << id << " deleted successfully\n";
}
void delete_by_name(std::vector<Contact> &data, const std::string name) {
int id = -1;
// assuming unique names
for (int i = 0; i < data.size(); i++) {
if (data[i].get_name() == name) {
id = i;
break;
}
}
if (id == -1) {
std::cerr << "Contact with " << name << " is not found\n";
return;
}
data.erase(data.begin() + id);
}
void delete_by_phone(std::vector<Contact> &data, const std::string phone) {
int id = -1;
for (int i = 0; i < data.size(); i++) {
if (data[i].get_name() == phone) {
id = i;
break;
}
}
if (id == -1) {
std::cerr << "Contact with " << phone << " is not found\n";
return;
}
data.erase(data.begin() + id);
}
void add_contact(Contact new_contact, std::vector<Contact> &data) {
data.push_back(new_contact);
}
void search_contact(std::vector<Contact> &data) {
std::cout << "1. Search by id.\n";
std::cout << "2. Search by name.\n";
std::cout << "3. Search by phone.\n";
enum { ID = 1, NAME = 2, PHONE = 3 };
int choice;
std::cin >> choice;
if (choice == ID) {
int id;
std::cout << "Enter id: \n";
std::cin >> id;
search_by_id(data, id);
}
else if (choice == NAME) {
std::string name;
std::cout << "Enter name: \n";
std::cin >> name;
search_by_name(data, name);
}
else if (choice == PHONE) {
std::string phone;
std::cout << "Enter phone: \n";
std::cin >> phone;
search_by_phone(data, phone);
}
else {
std::cerr << "Wrong choice.\n";
}
}
void search_by_id(std::vector<Contact> &data, int id) {
if (id < data.size() || id > data.size()) {
std::cerr << "Contact not found\n";
return;
}
View v;
v.print_contact_data(data[id]);
}
void search_by_name(std::vector<Contact> &data, const std::string name) {
int id = -1;
for (int i = 0; i < data.size(); i++) {
if (data[i].get_name() == name) {
id = i;
break;
}
}
if (id == -1) {
std::cerr << "Contact not found\n";
return;
}
View v;
v.print_contact_data(data[id]);
}
void search_by_phone(std::vector<Contact> &data, const std::string phone) {
int id = -1;
for (int i = 0; i < data.size(); i++) {
if (data[i].get_phone() == phone) {
id = i;
break;
}
}
if (id == -1) {
std::cerr << "Contact not found\n";
return;
}
View v;
v.print_contact_data(data[id]);
}
void edit_contact(std::vector<Contact> &data) {
std::cout << "Enter contact id\n";
int id;
std::cin >> id;
if (id < data.size() || id > data.size()) {
std::cerr << "Sorry, wrong id\n";
}
std::cout << "Do you want to edit this contact? [Y, N]\n";
View v;
v.print_contact_data(data[id]);
std::string choice;
std::cin >> choice;
if (choice.front() == 'Y') {
std::cout << "Enter new name:\n";
std::string name;
std::cin >> name;
data[id].set_name(name);
std::cout << "Enter new phone:\n";
std::string phone;
std::cin >> phone;
data[id].set_phone(phone);
std::cout << "Done\n";
}
else {
std::cerr << "Wrong choice.\n";
}
}
};
class View {
public:
std::vector<Contact> data;
void print_contact_data(Contact data) {
std::cout << data.get_name() << ' ' << data.get_phone() << '\n';
}
void print_all_contacts() {
int curr = 1;
for (auto x : data)
std::cout << curr++ << ". " << x.get_name()
<< ' ' << x.get_phone() << '\n';
}
Contact get_contact_data() {
Contact data;
std::cout << "Enter contact name:\n";
std::string name;
std::cin >> name;
std::cout << "Enter contact phone:\n";
std::string phone;
std::cin >> phone;
data.set_name(name);
data.set_phone(phone);
return data;
}
void main_menu() {
enum { ADD = 1, DELETE = 2, EDIT = 3,
SEARCH = 4, PRINT = 5, EXIT = 6 };
std::cout << "1. Add contact\n";
std::cout << "2. Delete contact\n";
std::cout << "3. Edit contact\n";
std::cout << "4. Search contact\n";
std::cout << "5. Print all contacts\n";
std::cout << "6. Exit\n";
int choice;
std::cin >> choice;
Controller temp;
if (choice == ADD) {
temp.add_contact(get_contact_data(), data);
} else if (choice == DELETE) {
temp.delete_contact(data);
} else if (choice == EDIT) {
temp.edit_contact(data);
} else if (choice == SEARCH) {
temp.search_contact(data);
} else if (choice == PRINT) {
print_all_contacts();
} else if (choice == EXIT) {
exit(0);
} else {
std::cout << "Wrong choice\n";
}
}
};
int main() {
View v;
v.main_menu();
return 0;
}
我试图实现 MVC 设计模式。 基本上,这是一个基本的联系人管理系统。 可以添加、删除、编辑、搜索联系人。 View 类负责用户操作并与用户交互。 接触类只是模型。 我收到此错误消息“'View v' 的类型不完整,无法定义”。 我搜索了一些解决方案,但找不到我的错误是什么。
您具有以下代码结构:
class Contact;
class Controller;
class View;
class Controller {
public:
// ...
void search_by_id(std::vector<Contact> &data, int id) {
// ...
View v;
// ...
}
// ...
};
class View {
public:
// ...
void main_menu() {
// ...
Controller temp;
// ...
}
// ...
};
这会产生错误,因为View v;
需要定义View
。 将View
的定义移到Controller
之前不会解决问题,因为Controller temp;
会有同样的问题。
简单的解决方法是将所有函数定义移到类之外,并在定义其他类之后:
class Controller {
public:
// ...
void search_by_id(std::vector<Contact> &data, int id);
// ...
};
class View {
public:
// ...
void main_menu();
// ...
};
void View::main_menu() {
// ...
Controller temp;
// ...
}
void Controller::search_by_id(std::vector<Contact> &data, int id) {
// ...
View v;
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.