gpt4 book ai didi

c++ - 我可以使用 STL 容器管理不完整的类对象吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:01 24 4
gpt4 key购买 nike

在 C++11 中,声明一个仍然是不完整类型的类的 vector 肯定是无效的,对吗?我以为我只能使用不完整的类型作为指针、引用、返回类型或参数类型。搜索 (1)对于“不完整类型的 vector ”向我建议不完整类型的容器应该是一个错误(我使用的是 g++ 版本 4.8.1。)。然而,以下代码在我的系统上编译得很好:

#ifndef SCREEN
#define SCREEN
#include <string>

using namespace std;

class Screen;

class Window_mgr{
public:
typedef vector<Screen>::size_type screenindex;
void clear(screenindex);
private:
vector<Screen> screens;
};

class Screen{
friend void Window_mgr::clear(screenindex);
public:
typedef string::size_type pos;
Screen() = default;
Screen(pos ht, pos wt): height(ht), width(wt), contents(ht*wt, ' ') { }
Screen(pos ht, pos wt, char c): height(ht), width(wt), contents(ht*wt, c) { }

private:
pos height = 0, width = 0;
pos cursor = 0;
string contents;

};

inline void Window_mgr::clear(screenindex i){
Screen& s = screens[i];
s.contents = string(s.height*s.width, ' ');
}

#endif // SCREEN

尽管 Window_mgr 声明了一个 Screens vector ,它仍然是一个不完整的类型。我的示例中的这些类实际上是基于 C++ Primer 的第 7.3 章的。一个问题让我定义我自己版本的 Screen 和 Window_mgr,其中成员函数 clear 是 Window_mgr 的成员和 Screen 的友元。除了 Window_mgr 还意味着包含一个屏幕 vector 。

如果创建一个不完整类型的 vector 是无效的,我将如何使用前向声明来做到这一点?如果我在 Window_mgr 中有一个屏幕 vector ,那么它的类定义必须在已经定义了类 Screen 之后。除了Screen必须有Window_mgr的clear成员函数的友元声明,但是下面的重排是错误的,因为Screen在一个不完整的类型上使用了作用域操作符;

class Window_mgr;

class Screen{
friend void Window_mgr::clear(screenindex);
public:
typedef string::size_type pos;
Screen() = default;
Screen(pos ht, pos wt): height(ht), width(wt), contents(ht*wt, ' ') { }
Screen(pos ht, pos wt, char c): height(ht), width(wt), contents(ht*wt, c) { }

private:
pos height = 0, width = 0;
pos cursor = 0;
string contents;

};

class Window_mgr{
public:
typedef vector<Screen>::size_type screenindex;
void clear(screenindex);
private:
vector<Screen> screens;
};

inline void Window_mgr::clear(screenindex i){
Screen& s = screens[i];
s.contents = string(s.height*s.width, ' ');
}

我能想到的唯一方法是用类的友元声明替换成员函数友元声明

class Screen{
friend class Window_mgr;
// other stuff
}

但这不是我想要的问题。

最佳答案

标准容器目前不支持不完整的类型;比照。 Can standard container templates be instantiated with incomplete types? - 也就是说,实现可以选择支持不完整的类型作为扩展,但这会使您的代码不可移植。

论文n4371 Minimal incomplete type support for standard containers, revision 2已被纳入 C++ 标准的最新草案 (n4527),因此除非出现意外情况,否则 vectorlist 很可能会支持不完整的类型和 C++17 中的 forward_list


有一种方法可以满足“C++ Primer”中的要求,而不依赖于实现扩展或 C++17:

  1. clearWindow_mgr的成员函数;
  2. Window_mgr::clear()Screen 的友元;
  3. Window_mgr 包含一个 Screen vector :

您可以使 Screen 成为 Window_mgr 的嵌套类:

class Window_mgr{
public:
typedef std::size_t screenindex;
void clear(screenindex);

class Screen{
friend void Window_mgr::clear(screenindex);
public:
// ...
};

// ...
private:
vector<Screen> screens;
};

即使在这里,我也不得不调整 screenindex 类型的定义以打破依赖循环。

关于c++ - 我可以使用 STL 容器管理不完整的类对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31858878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com