小编Kia*_*ian的帖子

std :: map键类必须满足哪些要求才能成为有效键?

我想将给定类的对象映射到另一个对象的对象.然而,我想用作关键的类不是由我编写的,而是一个struct带有一些值的简单类.std :: map命令它的内容,我想知道它是如何做的,以及是否有任意类可以用作键或者是否需要定义一组需求(运算符和不需要).

如果是这样,我可以为实现运算符映射用途的类创建一个包装器.我只需要知道我需要先实现什么,并且我在网上找到的类的引用都没有指定它们.

c++ stl key map

70
推荐指数
2
解决办法
4万
查看次数

当const方法是公共的并且非const方法受保护时,为什么C++不会转换为const?

我用两个get方法创建了一个类,一个是const,一个是非const.const方法是公共的,因此用户可以查询向量.非const方法受到保护,因此我可以使用它来修改我需要的数据.

但是,当我尝试使用该类并调用get方法时,编译器会抱怨非const方法受到保护.相反,我必须使用const_cast将对象强制转换为const,因此我可以使用public方法.

有办法解决这个问题吗?为什么编译器不会执行转换,因为有一个公共方法?如果我删除受保护的版本并且只保留const版本,它可以正常工作,因此它会在这种情况下进行转换.转换为const始终是安全的.它正在消除常量问题.

c++ const

11
推荐指数
2
解决办法
407
查看次数

我可以在抽象类中有静态数据成员吗?

我设计了一系列相关的类,为了能够管理它们,我让它们派生自一个抽象类。

这些类都需要访问一系列共享资源,我发现自己在每个类中都创建了一个指针向量,所有这些都相同(它们必须相同)。似乎在基类中创建一个静态成员将使所有派生类都可以访问此向量,这意味着我只需要构建一次(构建后也不会更改,只需查找即可)。

我的问题是这是否可以,如果可以,我该如何构建它,而无需从派生类之一调用“填充向量”方法?

我的想法是做类似的事情

class Resource {};

enumR {RES0, RES1};

class AbstractClass
{
    public:
        virtual void OnInit() = 0;
        void static fillVector(Resource* pResource, enumR Resourcename)
            {lResource[Resourcename]=pResource;};
    protected:
        static vector<Resource*> lResource;
};

vector<Resource*> AbstractClass::lResource;

int main()
{
    Resource res0, res1;
    AbstractClass::fillVector(&res0, RES0);
    AbstractClass::fillVector(&res1, RES1);

    return 0;
};
Run Code Online (Sandbox Code Playgroud)

然后,当我实例化从 AbstractClass 派生的任何类的对象时,我就可以访问 lResource 向量,这正是我想要的。

这行得通吗?可怕吗?可以吗?

c++ abstract-class static-members

5
推荐指数
1
解决办法
7589
查看次数

如何声明模板常量类型?

如果我做一个typedef如

typedef int const cint;
Run Code Online (Sandbox Code Playgroud)

cint将引用一个无法修改的int.我可以cint在任何采用类型(模板参数,函数定义等)的上下文中使用.

但是,typedef不适用于模板.我的希望是能够声明一个类似的模板,Constant<SomeType>并将其引用到a const SomeType,我可以用cint上面的方式.可能吗?

c++ templates const

3
推荐指数
2
解决办法
187
查看次数

如果正确使用它从不抛出,我应该声明一个方法noexcept吗?

我正在实现一个队列,我想知道,当用户误用容器时我该怎么办?

例如,我有两个方法,Front和Pop,它们从不抛出(我static_assert,包含元素的析构函数是noexcept),只要它们不在空队列中调用即可.如果在空队列中调用它们,我可以添加一个检查,但是然后我无法定义它们noexcept.

我认为声明这些noexcept是有意义的,然后说在空队列上调用时行为是未定义的(我提供了Size和Empty方法供用户检查).然后我可以仅在调试版本上添加检查,因此它在调用时会在调试时终止,并尝试在发布时销毁或取消引用缺少的元素.我想知道更好的方法是什么.


在考虑了接受的答案后,我决定遵循标准.Vector的pop_back没有标记为noexcept,并且与我的Pop具有相同的语义,所以我也不会将它标记为noexcept.一般而言,将尽量避免将狭义合约设置为noexcept.

c++ templates exception c++11

3
推荐指数
1
解决办法
530
查看次数

如何给lambda一个持续时间与lambda一样长的内部值?

我想在lambda中修改一个变量而不影响封闭范围.表现得像这样的东西:

std::vector vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
{
  auto sum = 0;
  std::for_each(vec.begin(), vec.end(), [sum](int value) mutable
  {
    sum += value;
    std::cout << "Sum is up to: " << sum << '/n';
  });
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够在不声明sumlambda之外的变量的情况下完成它.像这样的东西:

std::vector vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

std::for_each(vec.begin(), vec.end(), [auto sum = 0](int value) mutable
{
  sum += value;
  std::cout << "Sum is up to: " …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11 c++14

3
推荐指数
1
解决办法
273
查看次数

运营商==或!=抛出这种情况?

我正在编写一个程序,我已经创建了一个POD结构的std :: vector.结构的一个成员是唯一标识符.

为了能够使用std :: binary_search,我必须为struct实现operator <.遵循这里的指导原则,我正在为==,!=,<,>,> =和<=编写完整的重载集.

这提出了一个我不确定如何处理的问题.向量将按照我为每个结构分配的唯一ID进行排序.如果两个结构具有相同的标识符,则它们是相同的.但是,如果两个结构具有相同的标识符但其他成员中的数据不同,则会出现这种情况.

这绝不应该发生.让比较运算符检查其余字段然后抛出异常(如果它们不同但ID是相同的)是否合适?什么样的例外最合适?

c++ exception operator-overloading

2
推荐指数
1
解决办法
98
查看次数

我可以用另一个类成员初始化初始化列表中的对象吗?

在网站上还没有发现这个问题。假设我有两个类,其中一个类包含对另一个类的引用:

class ClassA {};

class ClassB
{
    classA & r_classA;
    public:
        ClassB( ClassA & io_classA ):r_classA( io_classA ){}
};
Run Code Online (Sandbox Code Playgroud)

因此,如果我想创建 ClassB 的实例,我必须在构造函数中向它传递对 classA 的引用:

int main()
{
    ClassA classA;
    ClassB classB ( classA );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在假设我创建了一个 ClassC 类来保存这两个:

class ClassC
{
    ClassA m_classA;
    ClassB m_classB;
    public:
        ClassC();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以指望在初始化列表中构造 m_classB 之前创建 m_classA 吗?也就是说,我可以这样做吗:

ClassC::ClassC()
: m_classA()
, m_classB( m_classA )
{}
Run Code Online (Sandbox Code Playgroud)

这个标准符合吗?便携的?我需要采取任何特殊的预防措施吗?我已经在 ClassC 主体中的 m_classB 之前声明了 m_classA,并且编译器没有抛出任何警告。该程序似乎工作正常。我只是想检查一下我是否没有指望一些不可靠的行为会导致崩溃或奇怪的错误。

c++ initialization reference class

0
推荐指数
1
解决办法
1543
查看次数