如何解决这个正向类声明问题
How to solve this forward class declaration problem?
我遇到以下情况:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// Forward declarations
class Owner;
class Item;
class Owner {
public:
string name;
vector<Item> item;
Owner(string _name, initializer_list<Item> _item) : name(_name), item(_item) {
for (size_t i = 0; i < item.size(); i++)
item[i].owner = this;
}
// change the owner when copying...
Owner(const Owner& o) {
name = o.name;
item = o.item;
for (size_t i = 0; i < item.size(); i++)
item[i].owner = this; // is this OK?
}
Owner& operator = (const Owner& o) {
name = o.name;
item = o.item;
for (size_t i = 0; i < item.size(); i++)
item[i].owner = this;
return *this;
}
};
class Item {
public:
string name;
Owner* owner;
Item(string _name) : name(_name) {}
string getInfo() {
return name + " owned by " + owner->name;
}
};
int main(){
Item Cup("Cup"), Plate("Plate");
Owner John("John", { Cup, Plate });
cout << Cup.getInfo() << endl; // expecting "Cup owned by John"
return 0;
}
一个所有者可以有多个项目,但每个项目也必须包含其所有者的信息。当我运行这个时,我得到
错误C2027使用未定义类型的"项目">
我以为这可以通过使用前向类声明来解决,但没有这样的运气。另外,我猜我的复制构造函数和赋值运算符可以吗?
正向声明类型只是解决方案的一部分。当依赖关系是循环的时,您还需要移动至少一种类型的函数的定义——通常放在.cpp文件中(但如示例所示,这不是必要的(。
工作示例:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// Forward declarations
class Owner;
class Item {
public:
string name;
Owner* owner;
Item(string _name) : name(_name) {}
string getInfo();//<-- only declaration now
};
class Owner {
public:
string name;
vector<Item> item;
Owner(string _name, initializer_list<Item> _item) : name(_name), item(_item) {
for (size_t i = 0; i < item.size(); i++)
item[i].owner = this;
}
// change the owner when copying...
Owner(const Owner& o) {
name = o.name;
item = o.item;
for (size_t i = 0; i < item.size(); i++)
item[i].owner = this; // is this OK?
}
Owner& operator = (const Owner& o) {
name = o.name;
item = o.item;
for (size_t i = 0; i < item.size(); i++)
item[i].owner = this;
return *this;
}
};
//or put in .cpp file
string Item::getInfo() {
return name + " owned by " + owner->name;
}
int main(){
Item Cup("Cup"), Plate("Plate");
Owner John("John", { Cup, Plate });
cout << Cup.getInfo() << endl; // expecting "Cup owned by John"
return 0;
}
自己试试
此外,您将物品复制到所有者中,因此当您打印原件时,它只打印"Cup owned by",而所有者"John"不见了。目前尚不清楚应该以何种方式解决这一问题,但可以通过存储std::shared_ptr
而不是来解决,如果项目应该共享。
使用std::vector<Item>
时,Item
必须是完整类型。在这种情况下,您只在Item
中使用Owner*
,因此Item
应该放在第一位。由于您在getInfo()
中取消了对Owner*
的引用,因此它的定义应该在Owner
类之后:
class Owner;
class Item {
// ...
std::string getInfo() const;
};
class Owner {
// ...
};
std::string Item::getInfo() const
{
// return ...
}
相关文章:
- Visual Studio中的函数声明和函数定义问题
- 如何在标头中声明(或定义)函数的问题
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 如何解决这个正向类声明问题
- NetBeans IDE 8.2 C++字符串声明问题
- C++通告声明问题
- 外部变量和数组声明问题C
- 错误C2447,应为声明问题
- 面向C++的main.cpp中的可视化结构声明问题
- C++/CLI转发声明问题
- C++中跨源文件的函数声明问题
- 这个简单(?C++字符串声明问题似乎已经击败了StackExchange
- 前向声明问题:嵌套名称说明符中使用的类型不完整'enums::Category'
- c++数组/指针声明问题
- 编译时Time_t声明问题
- 类声明问题
- 命名空间和前向声明问题
- 成员类声明问题
- QT c++前向声明问题
- C++数组声明问题